網路程式設計 簡單理解

2021-10-25 16:10:21 字數 3653 閱讀 5967

八、 tcp

九、tcp傳輸最容易出現的問題

十、tcp實現聊天

如何準確定位網路上一台或多台主機

找到主機之後如何進行通訊

ip和埠號

網路通訊協議:udp、tcp

埠分類(0~65535)

公有埠:0~1023

軟體註冊埠:1024~49151,分配使用者或者程式

tomcat :8080、mysql:3306、oracle:1521

動態、私有:49152~65535

netstat -ano #檢視所有的埠

netstat -ano | findstr "8080" # 檢視指定的埠

tcp

udp使用者傳輸協議

使用者資料報協議

建立連線,形成傳輸資料的通道

將資料及源和目的封裝成資料報中,不需要建立連線

在連線中進行大資料量傳輸

每個資料報的大小在限制在64k內

連線、穩定,可靠協議

不連線、不穩定,不可靠協議

三次握手,四次揮手

客戶端,服務端

客戶端,服務端:沒有明確的界限

傳輸完成,釋放連線,效率低

不管有沒有準備好,都可以傳送

不用連線,只需知道對方的位址,可以相互傳送接收

重要類

常用方法

datagramsocket

send方法傳送包、帶引數的構造器開放乙個埠port、receive阻塞接收、close方法關閉流

datagrampacket

datagramsocket ds =

newdatagramsocket()

;byte

by =

"hello,udp"

.getbytes()

;datagrampacket dp =

newdatagrampacket

(by,

0,by.length,inetaddress.

getbyname

("127.0.0.1"),

10000);

ds.send

(dp)

;ds.

close()

;

datagramsocket ds =

newdatagramsocket

(10000);

byte

by =

newbyte

[1024];

datagrampacket dp =

newdatagrampacket

(by,by.length)

;ds.

receive

(dp)

;string str =

newstring

(dp.

getdata()

,0,dp.

getlength()

);system.out.

println

(str+

"--"

+dp.

getaddress()

);ds.close()

;

通過鍵盤錄入獲取要傳送的資訊。

將傳送和接收分別封裝到兩個執行緒中。

客戶端需要明確伺服器的ip位址以及埠,這樣才可以去試著建立連線,如果連線失敗,會出現異常。

連線成功,說明客戶端與服務端建立了通道,那麼通過io流就可以進行資料的輸,而socket物件已經提供了輸入流和輸出流物件,通過getinputstream(),getoutputstream()獲取即可。

與服務端通訊結束後,關閉socket。

socket s =

newsocket

("127.0.0.1"

,9999);

outputstream out = s.

getoutputstream()

;out.

write

("hello"

.getbytes()

);s.close()

;

服務端需要明確它要處理的資料是從哪個埠進入的。

當有客戶端訪問時,要明確是哪個客戶端,可通過accept()獲取已連線的客戶端物件,並通過該物件與客戶端通過io流進行資料傳輸。

當該客戶端訪問結束,關閉該客戶端。

serversocket ss =

newserversocket

(9999);

socket s = ss.accept ();

inputstream in = s.

getinputstream()

;byte

buf =

newbyte

[1024];

int num = in.

read

(buf)

;string str =

newstring

(buf,

0,num)

;system.out.

println

(s.getinetaddress()

.tostring()

+":"

+str);s.

close()

;ss.

close()

;

客戶端連線上服務端,兩端都在等待,沒有任何資料傳輸。

通過例程分析:

• 因為read方法或者readline方法是阻塞式。

解決辦法:

• 自定義結束標記

• 使用shutdowninput,shutdownoutput方法。

連線伺服器socket傳送訊息

//1. 要知道伺服器的位址、埠號

inetaddress serverip = inetaddress.

getbyname

("127.0.0.1");

int port =

9999

;//2. 建立乙個socket連線

socket socket =

newsocket

(serverip,port)

;//3. 傳送訊息 io流

outputstream os = socket.

getoutputstream()

;os.

write

("hello world"

.getbytes()

);

建立服務的埠 serversocket

等待使用者的鏈結 accept

接收使用者訊息

//1.  建立位址

serversocket serversocket =

newserversocket

(9999);

while

(true

) system.out.

println

(baos.

tostring()

);}

網路程式設計序列1 理解網路程式設計

常用的tcp ip協議的三種套接字型別 流套接字 tcp協議 資料報套接字 udp協議 原始套接字 ip icmo協議 區別在於 原始套接字可以讀寫核心沒有處理的ip資料報,而流套接字只能讀取tcp協議的資料,資料報套接字只能讀取udp協議的資料。tcp transmission control p...

網路程式設計 TCP理解

談到tcp就必須知道面向連線和可靠傳輸協議,什麼是面向連線?就要說到3次握手下面這張圖就是tcp的3次握手圖 當客戶端想要連線服務端時,會由客戶端的傳輸控制層傳送乙個 sync 包,然後服務端收到後會返回乙個 sync ack 表示知道 包,最後客戶端會在傳送乙個 ack 確定包,只有雙方都確定自己...

python網路程式設計理解

和客戶端程式設計相比,伺服器程式設計就要複雜一些。伺服器程序首先要繫結乙個埠並監聽來自其他客戶端的連線。如果某個客戶端連線過來了,伺服器就與該客戶端建立socket連線,隨後的通訊就靠這個socket連線了。所以,伺服器會開啟固定埠 比如80 監聽,每來乙個客戶端連線,就建立該socket連線。由於...