作者:ivanjjHelen | 来源:互联网 | 2023-08-01 10:30
Socket通信(二)--多线程服务器实现在我的上一篇博客点击打开链接中,实现了一个简单的类qq聊天功能。然而日常生活中通常一台服务器部署好后,会有成百上千的客户端对其进行访问,那么这样的功能又该如
Socket通信(二)-- 多线程服务器实现
在我的上一篇博客点击打开链接中,实现了一个简单的类qq聊天功能。然而日常生活中通常一台服务器部署好后,会有成百上千的客户端对其进行访问,那么这样的功能又该如何实现呢。下文对此多线程通信作一个说明。
服务端Socket具体代码为:
public class Server {
public static void main(String[] args) {
ServerSocket server=null;
try {
//创建一个服务器端socket,即ServerSocket,绑定指定的端口,并监听此端口
server=new ServerSocket(8888);
int count=0;//记录客户端的数量
System.out.println("***服务器端启动,等待客户端的连接***");
Socket socket=null;
//循环监听客户端的连接
while(true){
//调用accept()方法开始监听,等待客户端的连接
socket=server.accept();
ServerThread st=new ServerThread(socket);
st.start();
count++;
System.out.println("当前客户端连接数为:"+count);
InetAddress inetAddress=socket.getInetAddress();
System.out.println("当前客户端地址为:"+inetAddress.getHostName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端针对每一个客户端都会单独开启一个线程处理响应的请求,线程类为:
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();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally{
//关闭相关资源
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码为:
public class Client {
public static void main(String[] args) {
try {
//1.创建一个客户端socket,制定地址和端口
Socket client=new Socket("localhost", 8888);
//2.获取输出流,向服务器发送信息
OutputStream os=client.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将字节流包装为打印流
pw.write("用户名为:admin,密码为:123");
pw.flush();
client.shutdownOutput();
//3.获取输入流,输出客户端响应信息
InputStream is=client.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务端说"+info);//循环读取服务端响应信息
}
client.shutdownInput();//关闭输入流
//4.关闭相关资源
br.close();
isr.close();
is.close();
pw.close();
os.close();
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
首先启动server端,显示如下:
启动一个服务端后,server端显示如下:
再启动一个服务端后,server端显示为: