Socket通信入门小实例

客户端:

public class Client {

    private int port = 8000;  
    private String host = "localhost";  
    private Socket socket;  
  
    public Client() throws UnknownHostException, IOException {  
        socket = new Socket(host, port);  
    }  
  
    public void readFromUser() throws IOException{  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        String line;  
        while((line = br.readLine()) != null){  
            if(line.equals("bye")){  
                socket.close();  
                System.out.println("关闭socket");  
                break;  
            }  
            send(line);  
        }  
    }  
      
    public void send(String msg) throws IOException {  
        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);  
        pw.println(msg);  
    }  
  
    public static void main(String args[]) throws UnknownHostException,  
            IOException {  
        new Client().readFromUser();  
    }  
}

服务端:

public class Server {

    private int port = 8000;  
    private ServerSocket serverSocket;  
    private ExecutorService executorService;  
    private final int POOL_SIZE = 4;  
  
    public Server() throws IOException {  
        serverSocket = new ServerSocket(port, 2);  
        // 创建线程池  
        executorService = Executors.newFixedThreadPool(Runtime.getRuntime()  
                .availableProcessors()  
                * POOL_SIZE);  
        System.out.println("服务器启动。。。。。" + "初始线程数:"  
                + Runtime.getRuntime().availableProcessors() * POOL_SIZE);  
    }  
  
    public void service() throws IOException {  
        int count = 0;  
        while (true) {  
            Socket socket = serverSocket.accept();  
            System.out.println(++count + "客户端已链接");  
            // new Thread(new Handler(socket)).start();  
            executorService.execute(new Handler(socket));  
        }  
    }  
  
    public static void main(String args[]) throws IOException {  
        new Server().service();  
    }  
  
    private class Handler implements Runnable {  
  
        private Socket socket;  
  
        public Handler(Socket socket) {  
            this.socket = socket;  
        }  
  
        public void run() {  
            try {  
                handle();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
  
        private void handle() throws IOException {  
            BufferedReader br = new BufferedReader(new InputStreamReader(socket  
                    .getInputStream()));  
            String line;  
            while ((line = br.readLine()) != null) {  
                if(line.equals("goodbye")){  
                    socket.close();  
                    serverSocket.close();  
                    break;  
                }  
                System.out.println("From " + socket.getPort() + ":" + line);  
            }  
        }  
    }  
}

 

服务器采用了JDK自带的线程池来处理并发请求。 

还可以使用NIO来实现,即非阻塞通信

 

posted on 2017-02-07 17:45  liushao  阅读(1347)  评论(0编辑  收藏  举报

导航