Java Socket 一個服務器 多個客戶端雙向通信 多線程(線程池)

package com.test.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 服務器端
 * 一個服務器和多個客戶端進行通信 線程池
 * @author Administrator
 *
 */
public class NewServer {
    Socket socket;
    /**線程池**/
    ExecutorService executors;
    public NewServer() throws Exception{
        /**服務器綁定端口**/
         ServerSocket server = new ServerSocket(8080);
         /**建立線程池**/
         executors = Executors.newCachedThreadPool();
        /**時刻等待客戶端發出請求**/
        while(true){
            socket = server.accept();
            //把用戶每一次請求放入到線程池中
            executors.execute(new ServerThread(socket));
        }
    }
    class ServerThread extends Thread{
        Socket socket;
        BufferedReader in;
        PrintWriter out;
        public ServerThread(Socket socket) throws IOException {
            this.socket=socket;
            /**用於讀取客戶端發來的信息**/
            in =new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream());
        }
        @Override
        public void run() {
            try {
                while(true){
                    
                    String message = in.readLine();
                    out.println("hasreceive"+socket.getLocalPort()+"的消息");
                    out.flush();
                    System.out.println(socket.getLocalPort()+"==="+message);
                    if(message.equals("bye")){
                        break;
                    }
                }
                out.close();
                in.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }

    public static void main(String[] args) throws Exception {
        new NewServer();
    }
    
}


package com.test.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 客戶端
 * 一個服務器和多個客戶端進行通信 線程池
 * @author Administrator
 *
 */
public class Clients {
    Socket server;
    ExecutorService ex;
    public Clients() throws UnknownHostException, IOException {
        server = new Socket("127.0.0.1",8080);
        ex = Executors.newCachedThreadPool();
        ex.execute(new ClientThread(server));
        
    }
    class ClientThread extends Thread{
        Socket socket;
        BufferedReader in;
        PrintWriter out;
        InputStreamReader keybox = new InputStreamReader(System.in);  
        BufferedReader br = new BufferedReader(keybox);
        public ClientThread(Socket socket) throws IOException {
            this.socket = socket;
            /**用於讀取客戶端返回的信息**/
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream());
        }
        @Override
        public void run() {
            try {
                while(true){
                    String str = br.readLine();
                    out.println(str);
                    out.flush();
                    System.out.println("服務器響應"+in.readLine());
                    if(str.equals("bye")){
                        break;
                    }
                }
                in.close();
                out.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    public static void main(String[] args) throws UnknownHostException, IOException {
        new Clients();
    }
}


//用dos窗口 啓動服務器端  開多個 客戶端進行交互 便可
相關文章
相關標籤/搜索