八、 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連線。由於...