首页 > 代码库 > 多线程Java Socket编程示例

多线程Java Socket编程示例

package org.merit.test.socket;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.Socket;public 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();            }        }    }}


package org.merit.test.socket;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();                }            }        };    }}
package org.merit.test.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 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();    }}

  多线程Java Socket编程示例

多线程Java Socket编程示例