一、用戶端
package net.socketTest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.Reader;import java.io.Writer;import java.net.Socket;import java.net.UnknownHostException;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MultiThreadClient_jiaohu { public static void main(String[] args) throws InterruptedException { int numTasks = 2120; ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < numTasks; i++) { Thread.sleep(5L); exec.execute(createTask(i)); } } // 定義一個簡單的任務 private static Runnable createTask(final int taskID) { return new Runnable() { private Socket socket = null; private int port=8821; public void run() { Socket clinet = null; int task_ID=taskID;try {clinet = new Socket("192.168.252.155",port);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} Reader reader = null;try {reader = new InputStreamReader(clinet.getInputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} BufferedReader clinetin=new BufferedReader(reader); Writer writer = null;try {writer = new OutputStreamWriter(clinet.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} PrintWriter clientout=new PrintWriter(writer); int i=0; while(true){ i++; try { int ran=new Random().nextInt(20*60)+1;Thread.sleep(ran*1000L);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} String str=" 線程編號:"+task_ID; clientout.println(str); clientout.flush(); String newStr = null;try {newStr = clinetin.readLine();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} System.out.println(" --:"+newStr); if(i>=100000)break; } try {clinetin.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} clientout.close(); System.out.println(" ===發送結束==="); } }; }}
二、服務端
package net.socketTest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.*;import java.util.concurrent.*;public class SocketServer { private int port=8821; private ServerSocket serverSocket; private ExecutorService executorService;//線程池 private final int POOL_SIZE=2200;//單個CPU線程池大小 也是最大串連數,否則超出此數量的串連數無法連上 private int count=0; public SocketServer() throws IOException{ serverSocket=new ServerSocket(port); //Runtime的availableProcessor()方法返回當前系統的CPU數目. executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); System.out.println("start Socket Server at port: "+port); } public void start(){ while(true){ Socket socket=null; try { //接收客戶串連,只要客戶進行了串連,就會觸發accept();從而建立串連 socket=serverSocket.accept(); count++; System.out.println(" "+count); executorService.execute(new Handler(socket)); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { new SocketServer().start(); }}class Handler implements Runnable{ private Socket socket; public Handler(Socket socket){ this.socket=socket; } private PrintWriter getWriter(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream(); return new PrintWriter(socketOut,true); } private BufferedReader getReader(Socket socket) throws IOException{ InputStream socketIn=socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void run(){ try { System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort()); BufferedReader br=getReader(socket); PrintWriter pw=getWriter(socket); String msg=null; while((msg=br.readLine())!=null){ // System.out.println(msg); pw.println(msg); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } }}