Java基礎(chǔ)學(xué)習(xí) | TCP實(shí)現(xiàn)簡單的C/S通信

TCP客戶端TCPClient

通過java.net.Socket類創(chuàng)建客戶端對象
官方文檔介紹:此類實(shí)現(xiàn)客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機(jī)器間通信的端點(diǎn)。
構(gòu)造方法:
Socket(String host, int port) 創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號。
成員方法:
OutputStream getOutputStream() 返回此套接字的輸出流。
InputStream getInputStream() 返回此套接字的輸入流。

使用步驟

  1. 創(chuàng)建Socket對象,通過構(gòu)造方法指定服務(wù)器主機(jī)名和端口;
  2. 通過Socket對象的getOutputStream()獲取套接字的輸出流OutputStream對象;
  3. 通過OutputStream對象的write方法向服務(wù)器發(fā)送數(shù)據(jù);
  4. 使用Socket對象的getInputStream()獲取套接字的輸入流InputStream對象;
  5. 通過InputStream對象的read方法讀取服務(wù)器回發(fā)的數(shù)據(jù);
  6. 釋放資源(socket.close()) 關(guān)閉套接字。

代碼實(shí)現(xiàn)

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

        // 1. 創(chuàng)建Socket對象,通過構(gòu)造方法指定服務(wù)器主機(jī)名和端口
        Socket socket = new Socket("127.0.0.1", 8888);

        // 2. 通過Socket對象的getOutputStream()獲取套接字的輸出流OutputStream對象
        OutputStream os = socket.getOutputStream();

        // 3. 通過OutputStream對象的write方法向服務(wù)器發(fā)送數(shù)據(jù)
        os.write("請求連接1".getBytes());

        // 5.使用Socket對象的getInputStream()獲取套接字的輸入流InputStream對象
        InputStream is = socket.getInputStream();

        // 6. 通過InputStream對象的read方法讀取服務(wù)器回發(fā)的數(shù)據(jù)
        byte[] bytes = new byte[32];
        int len = is.read(bytes);  // len表示獲取有效的字節(jié)數(shù)
        System.out.println(new String(bytes, 0, len));

        // 7. 釋放資源(socket.close())  關(guān)閉套接字
        socket.close();
    }

注意

服務(wù)器需要先啟動(dòng)后,再啟動(dòng)客戶端,否則會(huì)拋出異常
java.net.ConnectException: Connection refused: connect


異常截圖.png

TCP服務(wù)端TCPServer

通過java.net.ServerSocket類來創(chuàng)建服務(wù)器對象
此類實(shí)現(xiàn)服務(wù)器套接字。服務(wù)器套接字等待請求通過網(wǎng)絡(luò)傳入。它基于該請求執(zhí)行某些操作,然后可能向請求者返回結(jié)果。
構(gòu)造方法:
ServerSocket(int port) 創(chuàng)建綁定到特定端口的服務(wù)器套接字。
成員方法:
Socket accept() 偵聽并接受到此套接字的連接。(服務(wù)器類沒有Socket類,需求方法獲取客戶端的Socket對象)

使用步驟

  1. 創(chuàng)建ServerSocket對象,通過構(gòu)造方法指定客戶端連接端口
  2. 通過accept方法獲取客戶端的Socket對象
  3. 通過Socket對象的getInputStream()獲取套接字的輸出流InputStream對象
  4. 通過InputStream對象的read方法讀取客戶端發(fā)送的數(shù)據(jù)
  5. 通過Socket對象的getOutputStream()獲取套接字的輸出流OutputStream對象
  6. 通過OutputStream對象的write方法向客戶端發(fā)送數(shù)據(jù)
  7. 釋放資源,關(guān)閉套接字

代碼實(shí)現(xiàn)

public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建ServerSocket對象,通過構(gòu)造方法指定客戶端連接端口
        ServerSocket serverSocket = new ServerSocket(8888);
        // 2. 通過accept方法獲取客戶端的Socket對象
        Socket socket = serverSocket.accept();
        // 3. 通過Socket對象的getInputStream()獲取套接字的輸出流InputStream對象
        InputStream is = socket.getInputStream();
        // 4. 通過InputStream對象的read方法讀取客戶端發(fā)送的數(shù)據(jù)
        byte[] bytes = new byte[32];
        int len = is.read(bytes);
        System.out.println(new String(bytes, 0, len));
        // 5. 通過Socket對象的getOutputStream()獲取套接字的輸出流OutputStream對象
        OutputStream os = socket.getOutputStream();
        // 6. 通過OutputStream對象的write方法向客戶端發(fā)送數(shù)據(jù)
        os.write("連接成功".getBytes());
        // 7. 釋放資源,關(guān)閉套接字
        socket.close();
        serverSocket.close();
    }

運(yùn)行步驟、結(jié)果

先運(yùn)行服務(wù)端,在啟動(dòng)客戶端
服務(wù)器控制臺輸出

請求連接1

客戶端控制臺輸出

連接成功
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容