(一)每一个请求需完成的任务,具体内容如下
package com.mytest.socket; import java.io.IOException; import java.io.InputStream; import java.net.Socket; public class SocketTask implements Runnable{ private Socket socket; private String name; public SocketTask(Socket socket,String name) { this.socket=socket; this.name=name; System.out.println(name+"开始....."); } @Override public void run() { InputStream in = null; try { in = socket.getInputStream(); byte []buff=new byte[100]; StringBuffer sb=new StringBuffer(); //读取客户传送的信息 while(in.read(buff)!=-1) { String str= new String(buff,"UTF-8").trim(); sb.append(str); } in.close(); System.out.println("接收到信息:"+sb.toString()); System.out.println(name+"完成"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(in!=null) { in.close(); } socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
(二)服务端接收到请求后需完成的动作,具体代码如下
package com.mytest.socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SocketSevice { //侦听端口 private int port; private ServerSocket serverSocket; //最大连接 private static int maxCount=3; //连接数量累计 private int index=0; private static final SocketSevice socketSevice=new SocketSevice(); //任务线程池 private ExecutorService threadPool=Executors.newFixedThreadPool(maxCount); private SocketSevice(){} public static SocketSevice getInstance() { return socketSevice; } public void listening(int port) throws IOException { this.port=port; serverSocket=new ServerSocket(port); //使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行 while(true){ Socket socket=serverSocket.accept(); SocketTask task=new SocketTask(socket,"任务"+index); threadPool.execute(task); index++; } } public static void main(String[] args) { SocketSevice s=SocketSevice.getInstance(); try { s.listening(1099); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public int getPort() { return port; } public void setPort(int port) { this.port = port; } }
(三)模拟多个客户端对服务器发出请求,修改上一章中SocketClient类的main方法,代码如下
public static void main(String[] args) { // TODO Auto-generated method stub try { for(int i=0;i<5;i++){ SocketClient client=new SocketClient("127.0.0.1",1099); client.writeString("哈哈哈"+i); client.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
先运行服务端代码(SocketServer),然后再运行客户端代码(SocketClient),效果如下