- 浏览: 458785 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- java基础 (59)
- struts (8)
- spring (8)
- 数据库 (8)
- java 网络编程 (29)
- hibernate (3)
- JavaScript (10)
- 日志管理 (2)
- jsp (4)
- servlet (7)
- xml (4)
- ajax (2)
- web service (4)
- 算法与数据结构 (13)
- java 反射机制 (11)
- java 泛型 (3)
- java I/O (8)
- java 线程 (12)
- JavaEE (6)
- java解惑 (33)
- 工具 (5)
- MyEclipse编程实践 (1)
- OSGI (2)
- 设计模式 (9)
- 正则表达式 (0)
- EJB (3)
- Ubuntu linux (6)
- Android (1)
- web前端 (2)
- 找工作 (1)
- SCA (1)
- maven (1)
- 缓存 (1)
- json (1)
- javamail (1)
- 工作笔记 (2)
最新评论
-
霜花似雪:
博主可以分享一下源码吗?
使用maven构建web项目实例 -
王庆波-行:
很好的demo!
memcache使用实例 -
surpassno:
大写的牛逼
java可视化显示内存使用情况 -
zhulin0504:
怎么访问NetEcho.html页面呀???
applet与servlet的网络通信 -
springdata:
java多线程实例demo源代码下载:http://www.z ...
java多线程例子
上一篇的程序服务器端只能接受一个客户端请求,本篇改为模拟多客户端程序
客户端:
服务器端:
只是加了一个while循环
简单的多客户端处理,加一个死循环即可,但如此服务器会阻塞用户的请求,即是服务器在没有处理完当前用户请求的情况下,是不能处理其他用户请求的,见改进的ModifiedServer
改进的server
虽然实现了多用户并发访问,但每次客户端访问,服务器端就要建立连接,花销较大,下篇请见用线程池实现套接字编程
客户端:
package socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class MultiClient { public static void main(String[] args) { MultiClient mc = new MultiClient(); mc.sendSubsequentRequest(); } private void sendSubsequentRequest() { for(int i=0;i<100;i++){ //模拟多个并发用户向客户端同时发送请求,其实在一台机子上还是有先后顺序的 new Thread(new RequestSender()).start(); } } } class RequestSender implements Runnable { @Override public void run() { try { callServer(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void callServer() throws UnknownHostException, IOException { int reqInt = 23; Socket s = new Socket("localhost", 8888); // 客户端给出IP和端口号 InputStream is = s.getInputStream(); OutputStream os = s.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); dos.writeInt(reqInt); dos.flush(); int serverInt = dis.readInt(); System.out.println("server answer " + reqInt + "*18 = " + serverInt); dis.close(); dos.close(); } }
服务器端:
只是加了一个while循环
package socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; //简单的处理多客户端 public class MultiServer { public MultiServer() { } public static void main(String[] args) { MultiServer ms = new MultiServer(); try { ms.listen(8888); } catch (IOException e) { e.printStackTrace(); } } private void listen(int port) throws IOException { ServerSocket server = new ServerSocket(port); while (true) { Socket socket = server.accept(); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); int receiveInt = dis.readInt(); // 读取客户端请求 System.out.println("The message from client is:" + receiveInt); dos.writeInt(receiveInt * 18); // 返回client端 dos.flush(); // 强制清空缓冲区 dos.close(); dis.close(); is.close(); } } }
简单的多客户端处理,加一个死循环即可,但如此服务器会阻塞用户的请求,即是服务器在没有处理完当前用户请求的情况下,是不能处理其他用户请求的,见改进的ModifiedServer
改进的server
package socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ModifiedServer { /* *处理客户端请求的线程类 *//////////////////////////////////////////// class RequestHandler implements Runnable { //处理客户端请求的类定义在服务器端类主体的内部 private Socket socket = null; public RequestHandler(Socket s) { this.socket = s; } @Override public void run() { processRequest(); } private void processRequest() { try { InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); int receiveInt = dis.readInt(); // 读取客户端请求 System.out.println("The message from client" +clientCount+ "is:" + receiveInt); dos.writeInt(receiveInt * 18); // 返回client端 dos.flush(); // 强制清空缓冲区 dos.close(); dis.close(); is.close(); delay(200l); //模拟业务处理延时 clientCount--; //处理完成,减少client端的数量 } catch (IOException e) { e.printStackTrace(); } } private void delay(long l) { try { Thread.sleep(l); } catch (InterruptedException e) { e.printStackTrace(); } } } //////////////////////////////////////////////////// int clientCount = 0; //客户端并发请求动态数目 static int port = 8888; int maxClientCount = 200; public static void main(String[] args) { ModifiedServer ms = new ModifiedServer(); try { ms.listenServer(port); } catch (IOException e) { e.printStackTrace(); } } //服务器监听方法 private void listenServer(int port) throws IOException { ServerSocket server = new ServerSocket(port); System.out.println("Server is listening port " + port); while (true) { clientCount++; if (clientCount <= maxClientCount) { Socket socket = server.accept(); //没有客户端请求到来时,系统将在此阻塞 new Thread(new RequestHandler(socket)); } else { System.out.println("服务器所能承受的客户端请求最大并发数已经到上限!"); } } } }
虽然实现了多用户并发访问,但每次客户端访问,服务器端就要建立连接,花销较大,下篇请见用线程池实现套接字编程
发表评论
-
计算机网络知识
2011-06-01 16:19 762一个http请求的详细过程 我们来看当我们在浏览器输入htt ... -
java udp socket实例
2010-12-06 12:28 7092客户端: package udp; import jav ... -
线程池实现tcp socket
2010-12-01 17:23 2847前面的程序,当一个客户端请求到来时,服务器端就会临时性的创建一 ... -
java tcp socket实例
2010-12-01 13:44 1597网络编程的基本模型就是客户端到服务器端模型,一段必须提供一个固 ... -
telnet协议(转)
2010-10-14 17:17 1111我们知道Telnet服务器软 ... -
whois协议(转)
2010-10-14 14:28 1335当我们预备建立一个Web站点,就必须向域名登记机构申请一个In ... -
java 网络协议(一)Tcp多线程服务器端编程
2010-10-14 11:33 54591,通用服务器代码: package multiThread; ... -
java 网络协议(一)UDP
2010-10-14 09:24 1435UDP测试程序,无需建立连接 package udp; ... -
java 网络协议(一)Tcp
2010-10-14 08:52 51071,简化的服务器端程序 package tcp; imp ... -
java 网络协议(一)InetAddress和Socket(含源码)
2010-10-14 08:24 18571,ip地址和主机名互换 package getip; ... -
ftp协议2(转)
2010-10-12 16:26 939FTP协议工作原理 FTP有 ... -
ftp协议(转)
2010-10-12 16:21 1236ftp协议 FTP协议将使用两 ... -
SMTP服务协议(转)
2010-10-11 15:31 1212SMTP服务概述 鉴于本课程的默认读者群是那些对Inter ... -
利用socket发送接收邮件(转)
2010-10-11 15:18 4154这是在网上摘的,执行接收邮件出现:530 Authentica ... -
jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)
2010-09-21 10:13 1395本例向用户通过参数指定的主机端口发送一段请求报文,然后读取和打 ... -
jdk6.0从入门到精通-----chapter6--http
2010-09-14 16:32 910用httpconnection进行文件下载,建立一般的jav ... -
java自学===Filter类的应用,验证用户
2010-09-14 14:37 910Filter类 package com; import ... -
java自学===Filter类的应用,网站数量统计
2010-09-14 12:31 1908package filterStatistic; imp ... -
jdk6.0从入门到精通-----chapter5网络编程 udp套接字
2010-09-12 13:46 1129用到的主要类DatagramPacket,DatagramSo ... -
jdk6.0从入门到精通-----chapter5网络编程 tcp连接池
2010-09-10 18:07 957package pool; import java.ne ...
相关推荐
Linux网络编程 TCP socket实例代码 小白终结者
C# TCP Socket 通讯 实例 客户端服务端,仅学习使用 C# TCP Socket 通讯 实例 客户端服务端,仅学习使用
资源名:三菱Q系列PLC TCP socket通讯实例程序加技术文档 资源类型:程序源代码 源码介绍:PLC 为三菱Q06H和QJ71E71-100模块; Socket 测试软件; 参考手册:Q 系列以太网接口模块用户手册基础篇 适合人群:新手及...
Tcp Socket client 事件驱动,与界面分开。
最近有个项目模块需要用到TCP Socket通讯,遇到了一个大坑,所以做了这个Demo。 本Demo主要实现了安卓(Android)TCP 客户端(Client)和服务器(Server)Demo的Socket通讯。以及对接硬件的项目数据在十六进制&&byte&&int...
QT测试tcp通讯SOCKET实例程序
socket socket编程实例 TCP通信编程 通信 通信编程 文档和源代码齐全
TCP性能测试工具和C#高性能异步Socket实例代码
实现了服务器与客户端功能的合二为一,客户端启动后,连接三次服务器,如果失败,则自己自动变为服务器。
基于tcp的socket编程实例,是由本人设计,说明可参见我的博客,谢谢大家支持。是初学网络编程的好资料。
附件为TCP通讯的程序。有服务器和客户端,功能:可以正常实现服务端和客户端的通讯,包括消息传输,小文件传输,聊天窗体震动效果,选择客户端等。具有很好的参考价值,亲测可用,有很多注释,方便大家理解,注意将...
matlab_QT测试tcp通讯SOCKET实例程序_源码
linux下面用c写的,注释清楚,调试通过,主要是简单的字符接收
tcp的socket通信实例,简单的使用,里面有详细的注释,适合初学者学习
比较好的利用socket实现文件传输功能。在Linux下测试可用。可以用来研究学习socket
简单的Socket的聊天程序实例 用C#完成 模拟IPMSG 不过我也是新手 只实现了聊天功能 TCP协议
Android tcp socket通信封装及实例 1、模拟器上和电脑上开的sokit服务端通信测试通过 2、下载sokit当服务端
在C#下用Socket编程其中用到的TCP来实现,当然还有UDP,将会出现在另一个例子里
c#基于TCP协议的Socket通信完整实例(实现多人聊天室),通过C#winform实现多人聊天,同时服务器可以向指定客户端发送消息。非常实用哦!
一个简单的SOCKET 通信实例,加入了心跳信息。实用 。