java多线程实现服务器端与多客户端之间的通信
用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。
应用多线程来实现服务器与多线程之间的通信的基本步骤
- 服务器端创建ServerSocket,循环调用accept()等待客户端链接
- 客户端创建一个Socket并请求和服务器端链接
- 服务器端接受客户端请求,创建socekt与该客户端建立专线链接
- 建立链接的socket在一个单独的线程上对话
- 服务器继续等待新的链接
服务器端Server.java
packagetest.concurrent.socket; importjava.io.*; importjava.net.InetAddress; importjava.net.ServerSocket; importjava.net.Socket; /** *Createdbydongon15-6-22. *基于TCP协议的Socket通信,实现用户登录 *服务器端 */ publicclassServer{ publicstaticvoidmain(String[]args){ try{ //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocketserverSocket=newServerSocket(8888); Socketsocket=null; //记录客户端的数量 intcount=0; System.out.println("***服务器即将启动,等待客户端的链接***"); //循环监听等待客户端的链接 while(true){ //调用accept()方法开始监听,等待客户端的链接 socket=serverSocket.accept(); //创建一个新的线程 ServerThreadserverThread=newServerThread(socket); //启动线程 serverThread.start(); count++;//统计客户端的数量 System.out.println("客户端的数量:"+count); InetAddressaddress=socket.getInetAddress(); System.out.println("当前客户端的IP:"+address.getHostAddress()); } }catch(IOExceptione){ e.printStackTrace(); } } }
服务器端线程处理类ServerThread.java
packagetest.concurrent.socket; importjava.io.*; importjava.net.Socket; /** *Createdbydongon15-6-22. *服务器端线程处理类 */ publicclassServerThreadextendsThread{ //和本线程相关的Socket Socketsocket=null; publicServerThread(Socketsocket){ this.socket=socket; } //线程执行的操作,响应客户端的请求 publicvoidrun(){ InputStreamis=null; InputStreamReaderisr=null; BufferedReaderbr=null; OutputStreamos=null; PrintWriterpw=null; try{ //获取一个输入流,并读取客户端的信息 is=socket.getInputStream(); isr=newInputStreamReader(is);//将字节流转化为字符流 br=newBufferedReader(isr);//添加缓冲 Stringinfo=null; //循环读取数据 while((info=br.readLine())!=null){ System.out.println("我是服务器,客户端说:"+info); } socket.shutdownInput();//关闭输入流 //获取输出流,响应客户端的请求 os=socket.getOutputStream(); pw=newPrintWriter(os);//包装为打印流 pw.write("欢迎你"); pw.flush();//将缓存输出 }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ //关闭资源 if(pw!=null) pw.close(); if(os!=null) os.close(); if(is!=null) is.close(); if(isr!=null) isr.close(); if(br!=null) br.close(); if(socket!=null) socket.close(); }catch(IOExceptione){ e.printStackTrace(); } } } }
客户端Client.java
packagetest.concurrent.socket; importjava.io.*; importjava.net.Socket; /** *Createdbydongon15-6-22. *客户端 */ publicclassClient{ publicstaticvoidmain(String[]args){ try{ //1、创建客户端Socket,指定服务器端口号和地址 Socketsocket=newSocket("localhost",8888); //2、获取输出流,向服务器发送信息 OutputStreamos=socket.getOutputStream();//字节输出流 PrintWriterpw=newPrintWriter(os);//将输出流包装为打印流 pw.write("用户名:tom;密码:456"); pw.flush(); socket.shutdownOutput();//关闭输出流 InputStreamis=socket.getInputStream(); InputStreamReaderisr=newInputStreamReader(is); BufferedReaderbr=newBufferedReader(isr); Stringinfo=null; //循环读取 while((info=br.readLine())!=null){ System.out.println("我是客户端:服务器说:"+info); } br.close(); is.close(); isr.close(); pw.close(); os.close(); socket.close(); }catch(IOExceptione){ e.printStackTrace(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。