一、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.歡迎關注微信公眾號:傅里葉變換,個人公眾號,僅用于學習交流,后臺回復”禮包“,獲取大資料學習資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156467.html
標籤:Java
上一篇:互聯網是如何連接的:計網概述
下一篇:06、MyBatis 逆向工程
