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

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

 

tcp是基於連接的,必須先啓動服務端,而後再啓動客戶端去連接服務端服務器

 

TCP協議編碼流程:socket

服務器端:                  客戶端tcp

實例化對象                  實例化對象ide

綁定IP地址和端口號         編碼

監聽spa

接收客戶端的鏈接           鏈接服務器3d

收發                         收發code

關閉                         關閉對象

 

 

 

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

解決方法: 

#加入一條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
相關文章
相關標籤/搜索