多线程Java Socket编程示例(转)

这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.

1.服务端

多线程Java Socket编程示例(转)package sterning;
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)import java.io.BufferedReader;
多线程Java Socket编程示例(转)import java.io.IOException;
多线程Java Socket编程示例(转)import java.io.InputStream;
多线程Java Socket编程示例(转)import java.io.InputStreamReader;
多线程Java Socket编程示例(转)import java.io.OutputStream;
多线程Java Socket编程示例(转)import java.io.PrintWriter;
多线程Java Socket编程示例(转)import java.net.*;
多线程Java Socket编程示例(转)import java.util.concurrent.*;
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)public class MultiThreadServer {
多线程Java Socket编程示例(转)    private int port=8821;
多线程Java Socket编程示例(转)    private ServerSocket serverSocket;
多线程Java Socket编程示例(转)    private ExecutorService executorService;//线程池
多线程Java Socket编程示例(转)    private final int POOL_SIZE=10;//单个CPU线程池大小
多线程Java Socket编程示例(转)    
多线程Java Socket编程示例(转)    public MultiThreadServer() throws IOException{
多线程Java Socket编程示例(转)        serverSocket=new ServerSocket(port);
多线程Java Socket编程示例(转)        //Runtime的availableProcessor()方法返回当前系统的CPU数目.
多线程Java Socket编程示例(转)        executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
多线程Java Socket编程示例(转)        System.out.println("服务器启动");
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)    
多线程Java Socket编程示例(转)    public void service(){
多线程Java Socket编程示例(转)        while(true){
多线程Java Socket编程示例(转)            Socket socket=null;
多线程Java Socket编程示例(转)            try {
多线程Java Socket编程示例(转)                //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
多线程Java Socket编程示例(转)                socket=serverSocket.accept();
多线程Java Socket编程示例(转)                executorService.execute(new Handler(socket));
多线程Java Socket编程示例(转)                
多线程Java Socket编程示例(转)            } catch (Exception e) {
多线程Java Socket编程示例(转)                e.printStackTrace();
多线程Java Socket编程示例(转)            }
多线程Java Socket编程示例(转)        }
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)    
多线程Java Socket编程示例(转)    public static void main(String[] args) throws IOException {
多线程Java Socket编程示例(转)        new MultiThreadServer().service();
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)}
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)class Handler implements Runnable{
多线程Java Socket编程示例(转)    private Socket socket;
多线程Java Socket编程示例(转)    public Handler(Socket socket){
多线程Java Socket编程示例(转)        this.socket=socket;
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)    private PrintWriter getWriter(Socket socket) throws IOException{
多线程Java Socket编程示例(转)        OutputStream socketOut=socket.getOutputStream();
多线程Java Socket编程示例(转)        return new PrintWriter(socketOut,true);
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)    private BufferedReader getReader(Socket socket) throws IOException{
多线程Java Socket编程示例(转)        InputStream socketIn=socket.getInputStream();
多线程Java Socket编程示例(转)        return new BufferedReader(new InputStreamReader(socketIn));
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)    public String echo(String msg){
多线程Java Socket编程示例(转)        return "echo:"+msg;
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)    public void run(){
多线程Java Socket编程示例(转)        try {
多线程Java Socket编程示例(转)            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();
            }
        }
    }
}

2.客户端

多线程Java Socket编程示例(转)package sterning;
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)import java.io.BufferedReader;
多线程Java Socket编程示例(转)import java.io.IOException;
多线程Java Socket编程示例(转)import java.io.InputStreamReader;
多线程Java Socket编程示例(转)import java.io.OutputStream;
多线程Java Socket编程示例(转)import java.net.Socket;
多线程Java Socket编程示例(转)import java.util.concurrent.ExecutorService;
多线程Java Socket编程示例(转)import java.util.concurrent.Executors;
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)public class MultiThreadClient {
多线程Java Socket编程示例(转)    
多线程Java Socket编程示例(转)    public static void main(String[] args) {
多线程Java Socket编程示例(转)        int numTasks = 10;
多线程Java Socket编程示例(转)        
多线程Java Socket编程示例(转)        ExecutorService exec = Executors.newCachedThreadPool();
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)        for (int i = 0; i < numTasks; i++) {
多线程Java Socket编程示例(转)            exec.execute(createTask(i));
多线程Java Socket编程示例(转)        }
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)    // 定义一个简单的任务
多线程Java Socket编程示例(转)    private static Runnable createTask(final int taskID) {
多线程Java Socket编程示例(转)        return new Runnable() {
多线程Java Socket编程示例(转)            private Socket socket = null;
多线程Java Socket编程示例(转)            private int port=8821;
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)            public void run() {
多线程Java Socket编程示例(转)                System.out.println("Task " + taskID + ":start");
多线程Java Socket编程示例(转)                try {                    
多线程Java Socket编程示例(转)                    socket = new Socket("localhost", port);
多线程Java Socket编程示例(转)                    // 发送关闭命令
多线程Java Socket编程示例(转)                    OutputStream socketOut = socket.getOutputStream();
多线程Java Socket编程示例(转)                    socketOut.write("shutdown\r\n".getBytes());
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)                    // 接收服务器的反馈
多线程Java Socket编程示例(转)                    BufferedReader br = new BufferedReader(
多线程Java Socket编程示例(转)                            new InputStreamReader(socket.getInputStream()));
多线程Java Socket编程示例(转)                    String msg = null;
多线程Java Socket编程示例(转)                    while ((msg = br.readLine()) != null)
多线程Java Socket编程示例(转)                        System.out.println(msg);
多线程Java Socket编程示例(转)                } catch (IOException e) {                    
多线程Java Socket编程示例(转)                    e.printStackTrace();
多线程Java Socket编程示例(转)                }
多线程Java Socket编程示例(转)            }
多线程Java Socket编程示例(转)
多线程Java Socket编程示例(转)        };
多线程Java Socket编程示例(转)    }
多线程Java Socket编程示例(转)}
多线程Java Socket编程示例(转)

从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子---Java基于Socket文件传输示例,就可以实现多线程文件的传输了

上一篇:win8/10 特技


下一篇:Java 本周四、五的相关研究——Excel 的文件管理(数据库初步)