網絡編程: 基於TCP協議的socket, 實現一對一, 一對多通信


TCP協議  面向連接 可靠的 面向字節流形式的

 

tcp是基於鏈接的,必須先啟動服務端,然后再啟動客戶端去鏈接服務端

 

TCP協議編碼流程:

服務器端:                  客戶端

實例化對象                  實例化對象

綁定IP地址和端口號         

監聽

接收客戶端的連接           連接服務器

收發                         收發

關閉                         關閉

 

 

 

問題:有的同學在重啟服務端時可能會遇到

解決方法: 

#加入一條socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址綁定到套接字
sk.listen()          #監聽鏈接
conn,addr = sk.accept() #接受客戶端鏈接
ret = conn.recv(1024)   #接收客戶端信息
print(ret)              #打印客戶端信息
conn.send(b'hi')        #向客戶端發送信息
conn.close()       #關閉客戶端套接字
sk.close()        #關閉服務器套接字(可選)
View Code

 

 

tcp三次握手: 一定是client先發起請求

             a 客戶端發起請求連接服務器

             b 服務器返回:接收到請求,並要求連接客戶端

             c 客戶端回復:可以連接

四次揮手:  誰先發起斷開連接的請求都可以

             a 客戶端發起斷開連接的請求:

                  意思是: 我想和你斷開連接,我沒有數據要繼續發送了,但是如果你有數據需要發送,我可以繼續接收

             b  服務器回復 : 我接收到你的請求了

             c  服務器發送 : 我已經准備好斷開連接了

             d  客戶端回復 : 收到你的信息,斷開連接

 

 

 tcp實現的一個聊天室, 可以實現一對多,但是必須斷掉別人的連接, 然后才能和下一個人聊,本質還是一對一

只是創建一個死循環,讓服務器一直處於待機狀態  

while 1:
    conn,addr = sk.accept()

 

 1 import socket
 2 
 3 
 4 sk = socket.socket()
 5 sk.bind(('127.0.0.1',8888))
 6 sk.listen()
 7 
 8 while 1:
 9 
10     conn,addr = sk.accept()
11 
12     msg_r = conn.recv(1024)
13     if msg_r.decode('utf-8') != 'q':
14         print(msg_r.decode('utf-8'))
15 
16     else:
17         break
18 
19     msg_s = input('>>>')
20     if msg_s != 'q':
21         conn.send(msg_s.encode('utf-8'))
22     else:
23         conn.send(msg_s.encode('utf-8'))
24         break
sever1
 1 import socket
 2 
 3 name = input('請輸入你的名字:\n')
 4 
 5 sk = socket.socket()
 6 sk.connect(('127.0.0.1', 8888))
 7 
 8 
 9 while 1:
10 
11     msg_s = input('>>>')
12     if msg_s != 'q':
13         sk.send((name + msg_s).encode('utf-8'))
14     else:
15         sk.send(msg_s.encode('utf-8'))
16         break
17 
18     msg_r = sk.recv(1024)
19     if msg_r != 'q':
20         print(msg_r.decode('utf-8'))
21     else:
22         break
23 
24 sk.close()
client1
 1 import socket
 2 
 3 name = input('請輸入你的名字:\n')
 4 
 5 sk = socket.socket()
 6 sk.connect(('127.0.0.1', 8888))
 7 
 8 while 1:
 9 
10     msg_s = input('>>>')
11     if msg_s != 'q':
12         sk.send((name + msg_s).encode('utf-8'))
13     else:
14         sk.send(msg_s.encode('utf-8'))
15         break
16 
17     msg_r = sk.recv(1024)
18     if msg_r != 'q':
19         print(msg_r.decode('utf-8'))
20     else:
21         break
22 
23 sk.close()
client2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM