Java Socket編程之TCP編程

Java Socket編程之TCP編程


全套的:https://www.yuque.com/shizhiy...
基礎:https://blog.51cto.com/wangdy/1588379
Java Socket編程基礎及深刻講解:http://www.javashuo.com/article/p-fexnlneg-a.htmlhtml


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

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

image.png

  1. Socket通訊的步驟

                ① 建立ServerSocket和Socket
                ② 打開鏈接到Socket的輸入/輸出流
                ③ 按照協議對Socket進行讀/寫操做
                ④ 關閉輸入輸出流、關閉Socket編程

  1. 服務器端:

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

/**
         * 基於TCP協議的Socket通訊,實現用戶登陸,服務端
         */
        //一、建立一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口
        ServerSocket serverSocket = new ServerSocket(10086);//1024-65535的某個端口
        //二、調用accept()方法開始監聽,等待客戶端的鏈接
        Socket socket = serverSocket.accept();
        //三、獲取輸入流,並讀取客戶端信息
        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();//關閉輸入流
        //四、獲取輸出流,響應客戶端的請求
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.write("歡迎您!");
        pw.flush();


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

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

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

//四、關閉資源
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);
}

[連接]()socket

相關文章
相關標籤/搜索