之前创建的工程只能实现一对一的socket通信,
https://blog.csdn.net/a897180673/article/details/87831835
但是当一个socket client连接以后,再次连接第二个client 端是没有办法通信的.
只能实现一对一通信 .
今天来写一个,一个socket服务端可以对应多个socket client 的
这里面其实用到的是多线程
以前单线程 用到的是
socket =serverSocket.accept();
然后再对这个socket进行相应的操作
多线程的时候,把这个socket传到新开的 线程中去操作就ok了.
上代码:
首先是Server端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws Exception{
//1.创建一个服务端socket
ServerSocket serverSocket=new ServerSocket(8888);
//2调用accept方法等待连接,线程会阻塞状态
System.out.println("Socket服务已启动,等待连接");
System.out.println("接收到客户端连接请求");
int count=0;
Socket socket=null;
while(true){
count++;
socket =serverSocket.accept();
new SockerServerThread(socket).start();
System.out.println("客户端数量"+count);
}
}
}
然后是每一个client连接的时候 都开一个线程的线程类:
import java.io.*;
import java.net.Socket;
public class SockerServerThread extends Thread{
Socket socket=null;
public SockerServerThread (Socket socket){
this.socket=socket;
}
//获取输入流
InputStream inputStream= null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter out=null;
//线程操作响应客户端请求
public void run(){
try {
inputStream = socket.getInputStream();
isr=new InputStreamReader(inputStream);
br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取信息
System.out.println("收到客户端的请求:"+info);
}
socket.shutdownInput();
//4.获取输出流,相应客户端请求
os=socket.getOutputStream();
out =new PrintWriter(os);
out.write("这是server端");
out.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
out.close();
try {
os.close();
br.close();
isr.close();
isr.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
最后是clinet端,和之前的client端是一样的
import java.io.*;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args)throws Exception {
//1.创建Socket客户端,指定服务器和端口
Socket socket=new Socket("127.0.0.1",8888);
//2.连接成功后发送信息
//获取输出流
OutputStream outputStream=socket.getOutputStream();
PrintWriter out=new PrintWriter(outputStream);
out.write("admin,admin");
out.flush();
socket.shutdownOutput();
//3.获取输入流得到服务器端的响应
InputStream inputStream= socket.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取信息
System.out.println("收到服务端的响应:"+info);
}
br.close();
isr.close();
out.close();
out.close();
socket.close();
}
}
把server端先跑起来,然后跑一下client端的代码,可以连接
这个时候再用socket工具连接一下,在发送一个消息
ok 都是没有问题的.
这样就轻松的实现了一个socket 服务端,多个socket client 端的通信.