多線程Java Socket編程示例
采用Java 5的ExecutorService來進行線程池的方式實現多線程,模擬客戶端多用戶向同一服務器端發送請求.
1.服務端
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 MultiThreadServer { private int port = 8821 ; private ServerSocket serverSocket; private ExecutorService executorService; // 線程池 private final int POOL_SIZE = 10 ; // 單個CPU線程池大小
public MultiThreadServer() throws IOException { serverSocket = new ServerSocket(port); // Runtime的availableProcessor()方法返回當前系統的CPU數目. executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE); System.out.println( " 服務器啟動 " ); } public void service() { while ( true ) { Socket socket = null ; try { // 接收客戶連接,只要客戶進行了連接,就會觸發accept();從而建立連接 socket = serverSocket.accept(); executorService.execute( new Handler(socket)); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { new MultiThreadServer().service(); }
}
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 String echo(String msg) { return " echo: " + msg; } 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(echo(msg)); if (msg.equals( " bye " )) break ; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (socket != null ) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } </pre>2.客戶端
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class MultiThreadClient {
public static void main(String[] args) { int numTasks = 10 ; ExecutorService exec = Executors.newCachedThreadPool(); for ( int i = 0 ; i < numTasks; i ++ ) { 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() { System.out.println( " Task " + taskID + " :start " ); try { socket = new Socket( " localhost " , port); // 發送關閉命令 OutputStream socketOut = socket.getOutputStream(); socketOut.write( " shutdown/r/n " .getBytes()); // 接收服務器的反饋 BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); String msg = null ; while ((msg = br.readLine()) != null ) System.out.println(msg); } catch (IOException e) { e.printStackTrace(); } } } ; }
}</pre>