一、UDP和TCP 1.UDP(user datagram protocol)用戶數據報協議; TCP(transmission control protocol)傳輸控制協議。 2.UDP特性:UDP是無連接通信協議,即在數據傳輸的時候,數據的發送端和接收端不建立邏輯連接 ,優點:消耗資源小,通信 ...
一、UDP和TCP
1.UDP(user datagram protocol)用戶數據報協議;
TCP(transmission control protocol)傳輸控制協議。
2.UDP特性:UDP是無連接通信協議,即在數據傳輸的時候,數據的發送端和接收端不建立邏輯連接 ,優點:消耗資源小,通信效率高,但是不建議傳輸重要數據,因為有可能會丟包,並且兩端是沒有反饋的,不知道是否已經接收到了數據。
3.TCP特性:TCP是面向連接的通信協議,即在傳輸數據之前先在發送端和接收端建立邏輯連接,然後再進行傳輸數據,它提供了兩台電腦之間可靠、無差錯的數據傳輸。“三次握手”。如果下載數據,一定要用這個協議,因為如果丟包可能會導致下載的數據包打不開。
4.TCP通信兩端需要Socket對象。兩種協議的差別在於:(1)UDP中只有發送端和接收端,不區分客戶端和伺服器端。TCP則嚴格區分。
通信時,只能客戶端先向伺服器端發送請求,並且伺服器端必須要事先啟動,不可以主動聯繫客戶端,只能等待被連接。
5.ServerSocket類,表示伺服器端;Socket類用於表示客戶端。
6.通信過程:
(1)先創建一個ServerSocket對象,相當於開啟一個服務,等待客戶端的連接;
(2)Socket對象使用該對象向伺服器端發送請求;
(3)伺服器端響應之後,兩者才建立連接。
二、ServerSocket類
1.各種構造方法使用方法:
(1)ServerSocket()
使用該構造方法在創建ServerSocket對象時並沒有綁定埠號,這樣的對象創建的伺服器端沒有監聽任何埠,不能直接使用,還需要繼續調用bind(SocketAddress endpoint)方法將其綁定到指定的埠號上,才可以正常使用。
(2)ServerSocket(int port)
使用該構造方法在創建ServerSocket對象時可以將其綁定到一個指定的埠號上(參數port就是埠號)。埠號可以指定為0,此時系統就會分配一個還沒有被其他網路程式使用的埠號,由於客戶端需要根據指定的埠號來訪問伺服器端程式,因此埠號隨機分配的情況並不多見,通常會讓伺服器端程式監聽一個指定的埠號。
(3)ServerSocket(int port,int backlog)
該構造方法是在第二個構造方法的基礎上增加了backlog參數,該參數用於指定在伺服器忙時可以與之保持連接請求的等待客戶數量,如果沒有指定參數,預設50;
(4)ServerSocket(int port,int backlog,InetAddress bindAddr)
該構造方法實在第三個構造方法基礎上增加了bindAddr參數,該參數用於指定相關的IP地址,該構造方法適用於電腦有多塊網卡和多個IP的情況,使用時可以明確指定ServerSocket在哪塊網卡或IP地址上等待客戶鏈接請求。
常用方法:
方法 |
說明 |
Socket accept() |
用於等待客戶端的連接,在客戶端連接之前會一直處於阻塞狀態,如果有客戶端連接,就會返回一個與之對應的Socket對象。 |
InetAddress getInetAddress |
用於返回一個InetAddress對象,該對象中封裝了ServerSocket綁定的IP地址。 |
Boolean isClosed() |
用於判斷ServerSocket對象是否為關閉狀態,如果是關閉狀態則返回true,反之返回false |
void bind(SocketAddress endpoint) |
用於將ServerSocket對象綁定到指定的IP地址和埠號,其中參數endpoint封裝了IP地址和埠號。 |
package com.bjpowernode.java_learning; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class D125_ServerSocket { public static void main(String[] args) { ServerSocket server_socket = null; Socket socket = null; DataInputStream in = null; DataOutputStream out = null; int port = 5050; try { //創建綁定埠的伺服器端Socket server_socket = new ServerSocket(port); }catch (IOException e) { System.out.println(e); } try { System.out.println("伺服器啟動!"); socket = server_socket.accept(); //監聽並接受此Socket的連接,此方法在連接之前是處於阻塞狀態。 in = new DataInputStream(socket.getInputStream());//創建輸入流 out = new DataOutputStream(socket.getOutputStream());//創建輸出流 String str = in.readUTF();//從輸入流讀取字元串,讀取結束之前處於阻塞狀態。 System.out.println("客戶機發送過來的信息是:"+str); out.writeUTF("你好,我是伺服器B");//向輸出流寫入字元串 }catch(Exception e) { System.out.println(e); } finally { try { //關閉網路連接 out.close(); in.close(); socket.close(); server_socket.close(); }catch (Exception e) { } } } }
通過輸入流對象讀取客戶端發來的內容,通過輸出流對象向客戶端發送相應的內容。
三、源碼
D125_ServerSocket.java
https://github.com/ruigege66/Java/blob/master/D125_ServerSocket.java
2.CSDN:https://blog.csdn.net/weixin_44630050
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料