Socket 之 TCP 簡單通信

1、具體實現步驟

2、客戶端

public class SocketTcpClient {

    public static final int PORT = 2000;

    public static void main(String[] args) throws IOException {


        // 1、創建socket對象
        Socket socket = new Socket();
        // 設置超時 (表示如果對方連接狀態10秒沒有收到數據的話強制斷開客戶端)
        socket.setSoTimeout(5000);
        // 建立連接,設置服務端ip和端口,並設置連接超時5秒
        InetAddress localHost = Inet4Address.getLocalHost();
        System.out.println("服務器端ip=" + localHost.getHostAddress() + ",port=" + PORT);
        socket.connect(new InetSocketAddress(localHost, PORT), 5000);
        System.out.println("開始連接....");

        System.out.println("客戶端  ip=" + socket.getLocalAddress() + ",port=" + socket.getLocalPort());
        System.out.println("服務端  ip=" + socket.getInetAddress() + ",port=" + socket.getPort());

        todo(socket);
    }


    private static void todo(Socket socket) {
        boolean tag = true;
        try {
            // 從鍵盤獲取流
            InputStream in = System.in;
            BufferedReader keyboardInputReader = new BufferedReader(new InputStreamReader(in));

            //  socket 輸入流
            InputStream inputStream = socket.getInputStream();
            BufferedReader inputStreamReader = new BufferedReader(new             InputStreamReader(inputStream));

            // 獲取 socket 輸出流
            OutputStream outputStream = socket.getOutputStream();
            PrintStream outPrintStream = new PrintStream(outputStream);
            do {
                // 數據寫入到服務端
                String line = keyboardInputReader.readLine();
                outPrintStream.println(line);

                // 服務端返回數據
                String serverDataStr = inputStreamReader.readLine();
                if (serverDataStr.equalsIgnoreCase("bye")) {
                    System.out.println("服務端回覆  : bye");
                    tag = false;
                } else {
                    System.out.println("服務端回覆  : " + serverDataStr);
                }
            } while (tag);

            inputStreamReader.close();
            outPrintStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 關閉客戶端
                socket.close();
                System.out.println("客戶端關閉");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3、服務端

public class SocketTcpServer {
    
    public static void main(String[] args) throws IOException {
        // 1、創建serverSocket

        ServerSocket serverSocket = new ServerSocket(2000);

        System.out.println("服務端開啓,等待客戶端加入");
        while (true) {
            // 等待連接
            Socket socket = serverSocket.accept();
            System.out.println("ip=" + socket.getInetAddress() + ",port=" + socket.getPort() + " 客戶端加入");
            new ClientHandler(socket).start();
        }
    }

    public static class ClientHandler extends Thread {
        private Socket mServerSocket;
        private boolean tag = true;

        private ClientHandler(Socket socket) {
            mServerSocket = socket;
        }
        @Override
        public void run() {
            super.run();
            try {
                // 獲取輸出流
                OutputStream outputStream = mServerSocket.getOutputStream();
                PrintStream outPrintStream = new PrintStream(outputStream);

                // 獲取輸入流
                InputStream inputStream = mServerSocket.getInputStream();
                BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(inputStream));
                do {
                    // 獲取客戶端發送數據
                    String clientData = inputStreamReader.readLine();
                    if (clientData.equalsIgnoreCase("bye")) {
                        tag = false;
                        System.out.println("客戶端發送數據 : bye");
                        outPrintStream.println("bye");
                    } else {
                        System.out.println("客戶端發送數據 : " + clientData);
                        outPrintStream.println("你發送字符長度爲" + clientData.length());
                    }
                } while (tag);
                outPrintStream.close();
                inputStreamReader.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("連接異常斷開");
            } finally {
                try {
                    mServerSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("ip=" + mServerSocket.getInetAddress() + ",port=" + mServerSocket.getPort() + " 客戶端退出");

        }
    }
}

4、運行結果貼圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章