接着上篇,多线程socket服务端代码如下:
package SocketServer2;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SocketServer {
private void initServer() throws IOException{
// 监听指定的端口
int port = 8888;
ServerSocket server = new ServerSocket(port);
System.out.println("server将等待客户端连接的到来");
ExecutorService threadPool = Executors.newCachedThreadPool();
// int i=1;
while(true){
//accept是一个阻塞方法
final Socket socket = server.accept();
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("客户端连接上了");
/*reader = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
getClientMessage(socket1);*/
InputStream in = socket.getInputStream();
byte[] buffer = new byte[1024];
while(true){
System.out.println("服务端将要读取客户端发来的信息。。。。");
int len = in.read(buffer);
System.out.println("服务端正在读取客户端发来的信息。。。。");
if(len != -1){
String info = new String(buffer, 0, len);
System.out.println("客户端消息:" + info);
}else{
//当本次客户端连接断开后才会执行break
System.out.println("跳出本次while循环:");
break;
}
}
// i++;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
public static void main(String[] args) throws Exception {
SocketServer server = new SocketServer();
server.initServer();
}
}
打开两个命令行窗口,按照上篇中的操作,如下图:
此时会发现,两个客户端都连接到了服务端,没有发生请求的串行,是因为服务端每次接收到一个客户端请求链接
都会创建一个线程来处理新的请求连接。这种方式虽然说,解决了请求串行的问题,但同时也造成了服务端资源开销
过大的问题,所以不是一个好的解决方案。