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();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。