1. 程式人生 > >Java網路 伺服器與客戶端的簡單通訊

Java網路 伺服器與客戶端的簡單通訊

不登高山,不知天之高也。不臨深淵,不知地之厚也。

 Java中的封裝類(Socket),在實現這個功能的時候,需要對Java中的Socket套接字的一些用法熟悉,伺服器與客戶端之間主要通過的Java中的IO流通訊。需要理解IO流的流出,流入問題。

 接下來,之間看程式碼了,在客戶端加入了多執行緒操作。自己定義了一多執行緒的工廠。

 伺服器

public class Server1 extends Socket {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(5000);//開啟伺服器,埠為5000.個人伺服器建議4位數,防止佔用其他埠
        System.out.println("伺服器已啟動,等待連線");
        //自己建立一個執行緒工廠,以下是各種引數
        // corePoolSize 核心執行緒數
        // maxPoolSize 最大執行緒數 核心執行緒數+救急執行緒數<=最大執行緒數
        // keepAliveTime 保持時間  如果一個執行緒閒暇的時間超過了保持時間,那就把它回收,但不會少於核心執行緒數
        // timeUnit 時間單位
        // BlockingQueue 阻塞佇列 當任務數超過核心執行緒數後,就把任務放入阻塞佇列排隊執行 (有界,無界)
//        ExecutorService service = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS,
//                new ArrayBlockingQueue<>(10));
        ExecutorService service = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>());
        while (true){
            Socket accept = serverSocket.accept();//等待客戶端的連線
            System.out.println("已連線……");
            service.submit(()->{//lambda 表示式
            // 把io相關的操作放線上程內執行,讓每個執行緒處理一個io操作,避免io阻塞
                try {
                    getStream(accept);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }
    private static void getStream(Socket accept) throws IOException {
        InputStream in = accept.getInputStream();//得到客戶端的位元組流
        OutputStream out = accept.getOutputStream();//要給客戶的位元組流
        while (true){

            byte[] bytes = new byte[1024];
            int len = in.read(bytes);
            if(len == -1){

                break;
            }

            String ins = new String(bytes, 0, len, "utf-8");
            System.out.println(ins);
            out.write(("伺服器回答"+ins).getBytes("utf-8"));//返回給客戶端

        }
    }
}

 接下來,看客戶端的程式碼,客戶端實現的是,可以在客戶端寫入資料,實時的顯示在伺服器端。

多個客戶對應一個客戶端。

客戶端

 

public class Client extends Socket {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 5000);//連線本地伺服器
        InputStream in = socket.getInputStream();//得到伺服器傳過來的位元組流
        OutputStream out = socket.getOutputStream();//要給伺服器傳的位元組流

        out.write("Helli".getBytes());//給伺服器一個Hello
        new Thread(new Runnable() {
            @Override
            public void run() {
                Scanner scanner = new Scanner(System.in);
                if (scanner.hasNextLine()){//判斷是否有下一行
                    String line = scanner.nextLine();//有就繼續輸出給服務端
                    try {
                        out.write(line.getBytes());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        while (true){

            byte[] bytes = new byte[1024];
            int len = in.read(bytes);
            if(len == -1){
                break;
            }
            //讀取伺服器的位元組流
            String result = new String(bytes,0,len,"utf-8");
            //返回給伺服器
            out.write(("Hello"+result).getBytes("utf-8"));
        }
    }
}