#tcp伺服器
import socket,time
import threading
s=socket.socket(socket.af_inet,socket.sock_stream)
s.bind(('127.0.0.1',8888))
s.listen(5)
print("waiting for connection...")
def tcplink(sock,addr):
print(sock,addr)
print('accept new connection from %s:%s...' % addr)
sock.send(b'welcome!')
while true:
data=sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8')=='exit':
break
sock.send(('hello,%s'%data.decode('utf-8')).encode('utf-8'))
sock.close()
print('connection from %s:%s closed.' % addr)
while true:
# 接受乙個新連線:
sock, addr = s.accept()
# 建立新執行緒來處理tcp連線:
t = threading.thread(target=tcplink, args=(sock, addr))
t.start()
注意:
1.這裡的函式tcplink一定要寫在while true迴圈前面
2.這裡的addr是乙個tuple,我這裡列印出來是('127.0.0.1', 63040),所以用兩個%s來接收
3.注意這裡與node不一樣的是我們每接收到乙個連線就會開闢一條新的執行緒,不然單執行緒會阻塞
4.注意我們這裡傳送資料的時候要對傳送的資料進行ecode
5.這裡的accept()函式:
socket accept(
socket s,
struct sockaddr far *addr,
int far *addrlen
所以我們用乙個sock和addr來儲存前面兩個,addr用於存放客戶端的位址,ocket包含的是客戶端的ip和port資訊
import socket
#tcp客戶端
s = socket.socket(socket.af_inet, socket.sock_stream)
# 建立連線:
s.connect(('127.0.0.1', 8888))
# 接收歡迎訊息:
print(s.recv(1024).decode('utf-8'))
for data in [b'michael', b'tracy', b'sarah',b'exit']:
# 傳送資料:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
注意:
1.字串前面加上b,表示bite
TCP 傳輸鏈結的釋放
摘自 深入理解計算機網路 王達著 機械工業出版社 1.ipv4資料報頭部格式 2.ipv6資料報頭部格式 3.ipv4資料報的封裝與解封裝 4.ipv4資料報的分段與重組 5.arp協議報文格式及arp表 6.arp位址解析原理 7.icmp協議及報文格式 8.ipv6協議族的其它協議 9.tcp的...
tcp鏈結的幾種狀態
說明 通常情況下 乙個正常的tcp連線,都會有三個階段 1 tcp三次握手 2 資料傳送 3 tcp四次揮手 裡面的幾個概念 客戶端發起乙個和服務建立tcp鏈結的請求,這裡是syn j 服務端接受到客戶端的建立請求後,返回兩個資訊 syn k ack j 1 客戶端在接受到服務端的ack資訊校驗成功...
tcp鏈結斷開的探測
有資料說,read write都可以探測tcp的斷開,但都不是實時的。但是實際在某些裝置上測試發現,即使開乙個執行緒每隔一小段時間發一次心跳包 write write可能總是成功的,write也不能探測連線已經斷開,而且這個狀態持續很久。所以,如果需要保持和裝置的連線,心跳包需要回覆,如果兩秒內無回...