java多线程Server/Client通信
服务端建立
(1)首先建立线程池进行socket处理
ServerSocket serverSocket = null;
//利用线程池实现伪异步数据处理
ExecutorService executorService = new ThreadPoolExecutor(5,10,60, TimeUnit.SECONDS,
new LinkedBlockingDeque<>(10),new ThreadPoolExecutor.AbortPolicy());
//创建服务端
try {
serverSocket = new ServerSocket(8099);
Socket socket = null;
while (true){
try {
System.out.println("waiting for connect");
socket = serverSocket.accept();
SocketMessageMannage socketMessageMannage = new SocketMessageMannage(socket);
executorService.execute(socketMessageMannage);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
(2)对socket内的数据具体处理方式
class SocketMessageMannage implements Runnable{
private Socket socket;
protected SocketMessageMannage(Socket socket){
this.socket = socket;
}
public void run(){
InputStream inputStream = null;
OutputStream outputStream = null;
try {
//以字节输入流的方式将接受的socket内容读取
inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
//将socket中的字节流信息读取进准备好的字节容器
int readlen = inputStream.read(bytes);
//将服务器当前时间发送回链接的客户端
outputStream = socket.getOutputStream();
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String str = simpleDateFormat.format(date);
System.out.println(str);
outputStream.write(str.getBytes());
//将接受的字节流通过字符串的方式打印
System.out.println(new String(bytes,0,readlen));
} catch (IOException e) {
e.printStackTrace();
}
//创建接受字节流容器
}
}
客户端建立
//创建客户端socket
Socket socket = new Socket();
//客户端连接至服务端
socket.connect(new InetSocketAddress("127.0.0.1",8099));
//以输出字节流的方式将本地数据输出至socket中
OutputStream outputStream = socket.getOutputStream();
// System.out.println(outputStream.getClass().getName());
//要发送的字符串信息
String str = "hello world";
//将字符串转化成字节流用outputstream进行输出
outputStream.write(str.getBytes());
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int readlen = inputStream.read(bytes);
System.out.println(new String(bytes,0,readlen));
if (outputStream != null){
outputStream.close();
}
if (inputStream != null){
inputStream.close();
}
socket.close();
在多个客户端同时运行时,服务端能够调用不同线程去处理