python中的TCP鏈結

2021-09-10 02:10:15 字數 1702 閱讀 7287

#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也不能探測連線已經斷開,而且這個狀態持續很久。所以,如果需要保持和裝置的連線,心跳包需要回覆,如果兩秒內無回...