Java Socket程式設計系列(二)開發帶回聲功能的Server和Client

indexman發表於2017-12-25

伺服器端:

package com.dylan.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 將來自客戶端的資訊加工一下送回去
 *
 * @author xusucheng
 * @create 2017-12-21
 **/
public class EchoServer {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(20011);
        //服務端在20011埠監聽客戶端請求的TCP連線
        Socket client = null;
        boolean f = true;
        while (f) {
            client = server.accept();
            //服務端在呼叫accept()等待客戶端的連線請求時會阻塞,直到收到客戶端傳送的連線請求才會繼續往下執行程式碼
            //連結成功後為每個客戶端連線開始做出處理
            try {
                PrintStream out = new PrintStream(client.getOutputStream());
                //獲取Socket的輸出流,用來向客戶端傳送資料
                BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
                //獲取Socket的輸入流,用來接收從客戶端傳送過來的資料
                boolean flag = true;
                while (flag) {
                    String str = buf.readLine();
                    //接收從客戶端傳送過來的資料
                    if (str == null || "".equals(str)) {
                        flag = false;
                    } else {
                        if ("bye".equals(str)) {
                            flag = false;
                        } else {
                            //將接收到的字串前面加上echo,傳送到對應的客戶端
                            out.println("echo:" + str);
                        }
                    }
                }
                out.close();
                client.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        server.close();
    }

}


客戶端:

package com.dylan.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;

/**
 * 客戶端
 *
 * @author xusucheng
 * @create 2017-12-23
 **/
public class EchoClient {
    public static void main(String[] args) throws Exception {
        Socket client = new Socket("127.0.0.1", 20011);
        //客戶端請求與本機在20011埠建立TCP連線
        client.setSoTimeout(10000);
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        //獲取鍵盤輸入
        PrintStream out = new PrintStream(client.getOutputStream());
        //獲取Socket的輸出流,用來傳送資料到服務端
        BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //獲取Socket的輸入流,用來接收從服務端傳送過來的資料
        boolean flag = true;
        while (flag) {
            System.out.println("輸入資訊:");
            String str = input.readLine();
            out.println(str);
            //傳送資料到服務端
            if ("bye".equals(str)) {
                flag = false;
            } else {
                try {
                    //從伺服器端接收資料有個時間限制(系統自設,也可以自己設定),超過了這個時間,便會丟擲該異常
                    String echo = buf.readLine();
                    System.out.println(echo);
                } catch (SocketTimeoutException e) {
                    System.out.println("Time out, No response");
                }
            }
        }
        input.close();
        if (client != null) {
            //如果建構函式建立起了連線,則關閉套接字,如果沒有建立起連線,自然不用關閉
            client.close(); //只關閉socket,其關聯的輸入輸出流也會被關閉
        }
    }
}


相關文章