java多线程实现服务器端与多客户端之间的通信
程序员文章站
2024-03-12 18:43:38
用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。
应用多线程来实现服务器与多线程之间的通信的基本步骤
服务器...
用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。
应用多线程来实现服务器与多线程之间的通信的基本步骤
- 服务器端创建serversocket,循环调用accept()等待客户端链接
- 客户端创建一个socket并请求和服务器端链接
- 服务器端接受客户端请求,创建socekt与该客户端建立专线链接
- 建立链接的socket在一个单独的线程上对话
- 服务器继续等待新的链接
服务器端server.java
package test.concurrent.socket; import java.io.*; import java.net.inetaddress; import java.net.serversocket; import java.net.socket; /** * created by dong on 15-6-22. * 基于tcp协议的socket通信,实现用户登录 * 服务器端 */ public class server { public static void main(string[] args) { try { //1、创建一个服务器端socket,即serversocket, 指定绑定的端口,并监听此端口 serversocket serversocket = new serversocket(8888); socket socket = null; //记录客户端的数量 int count = 0; system.out.println("***服务器即将启动,等待客户端的链接***"); //循环监听等待客户端的链接 while (true){ //调用accept()方法开始监听,等待客户端的链接 socket = serversocket.accept(); //创建一个新的线程 serverthread serverthread = new serverthread(socket); //启动线程 serverthread.start(); count++; //统计客户端的数量 system.out.println("客户端的数量: " + count); inetaddress address = socket.getinetaddress(); system.out.println("当前客户端的ip : " + address.gethostaddress()); } } catch (ioexception e) { e.printstacktrace(); } } }
服务器端线程处理类serverthread.java
package test.concurrent.socket; import java.io.*; import java.net.socket; /** * created by dong on 15-6-22. * 服务器端线程处理类 */ public class serverthread extends thread { //和本线程相关的socket socket socket = null; public serverthread(socket socket){ this.socket = socket; } //线程执行的操作,响应客户端的请求 public void run(){ inputstream is = null; inputstreamreader isr = null; bufferedreader br = null; outputstream os = null; printwriter pw = null; try { //获取一个输入流,并读取客户端的信息 is = socket.getinputstream(); isr = new inputstreamreader(is); //将字节流转化为字符流 br = new bufferedreader(isr); //添加缓冲 string info = null; //循环读取数据 while ((info = br.readline()) != null){ system.out.println("我是服务器,客户端说: " +info); } socket.shutdowninput(); //关闭输入流 //获取输出流,响应客户端的请求 os = socket.getoutputstream(); pw = new printwriter(os); //包装为打印流 pw.write("欢迎你"); pw.flush(); //将缓存输出 } catch (ioexception e) { 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 (ioexception e) { e.printstacktrace(); } } } }
客户端client.java
package test.concurrent.socket; import java.io.*; import java.net.socket; /** * created by dong on 15-6-22. * 客户端 */ public class client { public static void main(string[] args) { try { //1、创建客户端socket,指定服务器端口号和地址 socket socket = new socket("localhost",8888); //2、获取输出流,向服务器发送信息 outputstream os = socket.getoutputstream(); //字节输出流 printwriter pw = new printwriter(os); //将输出流包装为打印流 pw.write("用户名:tom; 密码:456"); pw.flush(); socket.shutdownoutput(); //关闭输出流 inputstream is = socket.getinputstream(); inputstreamreader isr = new inputstreamreader(is); bufferedreader br = new bufferedreader(isr); string info = null; //循环读取 while ((info = br.readline()) != null){ system.out.println("我是客户端:服务器说:" + info); } br.close(); is.close(); isr.close(); pw.close(); os.close(); socket.close(); } catch (ioexception e) { e.printstacktrace(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Java总结篇系列:Java泛型详解