多线程实现服务器与多个客户端通信
来源:互联网 发布:单片机制作简单小应用 编辑:程序博客网 时间:2024/05/27 20:59
鉴于ServerSocket的accept方法是阻塞的,那么只能通过多线程的方式实现多客户端连接与服务器连接
基本步骤:
1,服务端创建ServerSocket绑定端口号,循环调用accept()方法
2,客户端创建一个socket并请求和服务器端连接
3,服务器端接受客户端请求,创建socket与该客户建立连接
4,两个socket在一个单独的线程上通话
5,服务器端继续等待新的连接
也就是说当有一个新的客户端与服务端连接,就创建一个新的socket并在这个线程里面通信。
服务端代码:
multithreadingServer.class:
public class multithreadingServer { public static void main(String[] args) { try {ServerSocket serversocket=new ServerSocket(8888);Socket socket=null;int n=0;while(true){socket=serversocket.accept();//再来一个客户端就新建一个socketServerThread serverthread=new ServerThread(socket);serverthread.start();n++;System.out.println("已有"+n+"台客户端连接"); InetAddress address=socket.getInetAddress();//获取客户端的inetaddress对象 System.out.println("当前主机ip:"+address.getHostAddress());//获取客户端的ip}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}ServerThread.class:
public class ServerThread extends Thread{//服务器线程处理类 Socket socket=null; InputStream is=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; public ServerThread(Socket socket){ this.socket=socket; } public void run(){ try { is=socket.getInputStream();//获得字节流br=new BufferedReader(new InputStreamReader(is));//字节流转化为字符流并添加缓冲String info=null;while((info=br.readLine())!=null){System.out.println("我是服务端,客户端说:"+info);}socket.shutdownInput();//必须要及时关闭,因为readline这个方法是以\r\n作为界定符的,由于发送消息的那一端用的是PrintWriter的write()方法,这个方法并没加上\r\n,所以会一直等待//回复客户端os=socket.getOutputStream(); pw=new PrintWriter(os);pw.write("欢迎您!");pw.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if (pw!=null)pw.close();try {if (os!=null)os.close();if (br!=null)br.close();if (is!=null)is.close();//关闭返回的 InputStream 将关闭关联套接字。 socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }}
客户端代码保持不变:
public class client {public static void main(String[] args) {try {Socket socket=new Socket("127.0.0.1",8888);//创建客户端socket,因为是本地,ip地址就是127.0.0.1OutputStream os=socket.getOutputStream();PrintWriter pw=new PrintWriter(os);pw.write("用户名:admin;密码:123");pw.flush();socket.shutdownOutput();//必须加上这句话,表示输出流的结束,注意此时不能关闭os,因为关闭os会关闭绑定的socket//在客户端获取回应信息InputStream is=socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is));String info=null;while((info=br.readLine())!=null){System.out.println("我是客户端,服务端说:"+info);}br.close();is.close();pw.close();os.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
0 0
- 多线程实现服务器与多个客户端通信
- Java多线程实现多个客户端同时与服务器进行TCP通信
- 非阻塞socket对应的多线程服务器的实现---一个服务器如何与多个客户端进行通信?
- linux下socket实现多个客户端与服务器的通信
- Linux下网络socket编程——实现服务器(select)与多个客户端通信
- java Socket 一个服务器与多个客户端进行通信
- Java Socket多个客户端与服务器通信
- 多线程实现多客户端通信
- 多线程实现多客户端通信
- java多线程实现服务器端与多客户端之间的通信
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- HttpClient实现客户端与服务器的通信
- java实现客户端与服务器通信
- socket实现服务器与客户端通信
- Java实现服务器与客户端网络通信
- UDP实现服务器与客户端通信
- java_多线程_socket通信_多个客户端发送,服务器响应
- 客户端与服务器通信
- Java语言输出2到100之间的质数
- 技术宅找女朋友的技术分析
- [LeetCode] Regular Expression Matching 解题报告
- docker打包informix镜像
- 一个java泛型的例子
- 多线程实现服务器与多个客户端通信
- Elasticsearch Reference [5.2] » Setup Elasticsearch
- bzoj 3172: [Tjoi2013]单词 后缀数组+rmq+二分
- Python + Graphviz绘制神经网络结构图--简化版本实现
- bzoj1012: [JSOI2008]最大数maxnumber
- iOS C++ 关于深度学习(机器学习) (一)学习概览
- 华为OJ-------简单错误记录
- tomcat8下部署php项目
- 深度学习—学习计划