Java Socket編程之TCP編程

Java Socket編程之TCP編程


全套的:https://www.yuque.com/shizhiy...
基礎:https://blog.51cto.com/wangdy/1588379
Java Socket編程基礎及深入講解:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html


  1. TCP協議是面向連接的、可靠的、有序的、以字節流的方式發送數據,通過三次握手方式建立連接,形成傳輸數據的通道,在連接中進行大量數據的傳輸,效率會稍低
  2. Java中基於TCP協議實現網絡通信的類

    • 客戶端的Socket類
    • 服務器端的ServerSocket類

image.png

  1. Socket通信的步驟

                ① 創建ServerSocket和Socket
                ② 打開連接到Socket的輸入/輸出流
                ③ 按照協議對Socket進行讀/寫操作
                ④ 關閉輸入輸出流、關閉Socket

  1. 服務器端:

               ① 創建ServerSocket對象,綁定監聽端口
                ② 通過accept()方法監聽客戶端請求
                ③ 連接建立後,通過輸入流讀取客戶端發送的請求信息
                ④ 通過輸出流向客戶端發送鄉音信息
                ⑤ 關閉相關資源
**

   /**
         * 基於TCP協議的Socket通信,實現用戶登錄,服務端
         */
        //1、創建一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口
        ServerSocket serverSocket = new ServerSocket(10086);//1024-65535的某個端口
        //2、調用accept()方法開始監聽,等待客戶端的連接
        Socket socket = serverSocket.accept();
        //3、獲取輸入流,並讀取客戶端信息
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String info = null;
        while ((info = br.readLine()) != null) {
            System.out.println("我是服務器,客戶端說:" + info);
        }
        socket.shutdownInput();//關閉輸入流
        //4、獲取輸出流,響應客戶端的請求
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.write("歡迎您!");
        pw.flush();


        //5、關閉資源
        pw.close();
        os.close();
        br.close();
        isr.close();
        is.close();
        socket.close();
        serverSocket.close();
  1. 客戶端:

                ① 創建Socket對象,指明需要連接的服務器的地址和端口號
                ② 連接建立後,通過輸出流想服務器端發送請求信息
                ③ 通過輸入流獲取服務器響應的信息
                ④ 關閉響應資源 

//客戶端
//1、創建客戶端Socket,指定服務器地址和端口
Socket socket =newSocket("localhost",10086);
//2、獲取輸出流,向服務器端發送信息
OutputStream os = socket.getOutputStream();//字節輸出流
PrintWriter pw =newPrintWriter(os);//將輸出流包裝成打印流
pw.write("用戶名:admin;密碼:123");
pw.flush();
socket.shutdownOutput();
//3、獲取輸入流,並讀取服務器端的響應信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!null){
 System.out.println("我是客戶端,服務器說:"+info);
}

//4、關閉資源
br.close();
is.close();
pw.close();
os.close();
socket.close();
  1. 應用多線程實現服務器與多客戶端之間的通信

              ① 服務器端創建ServerSocket,循環調用accept()等待客戶端連接
              ② 客戶端創建一個socket並請求和服務器端連接
              ③ 服務器端接受苦讀段請求,創建socket與該客戶建立專線連接
              ④ 建立連接的兩個socket在一個單獨的線程上對話
              ⑤ 服務器端繼續等待新的連接     

//服務器線程處理
//和本線程相關的socket
Socket socket =null;
//
public serverThread(Socket socket){
this.socket = socket;
}

publicvoid run(){
//服務器處理代碼
}

//============================================
//服務器代碼
ServerSocket serverSocket =newServerSocket(10086);
Socket socket =null;
int count =0;//記錄客戶端的數量
while(true){
socket = serverScoket.accept();
ServerThread serverThread =newServerThread(socket);
 serverThread.start();
 count++;
System.out.println("客戶端連接的數量:"+count);
}

[鏈接]()

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