TCP編程
在python中可以使用socket模塊進(jìn)行TCP編程
客戶端
- 創(chuàng)建一個(gè)套接字socket
- 指定協(xié)議類型,使用協(xié)議IPv4或IPv6;AF_INET:表示IPv4;AF_INET6:表示IPv6
- 指定面向流的TCP協(xié)議:SOCKET_STREAM
import socket
s = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
建立連接,指定需要連接的服務(wù)器地址及端口
s.connect(('www.sina.com.cn', 80))
連接到www.sina.com.cn,端口為80數(shù)據(jù)收發(fā)
發(fā)送數(shù)據(jù):使用send()
接收數(shù)據(jù):使用recv(max) max參數(shù)表示一次最多接收的字節(jié)數(shù)調(diào)用完成后使用close()函數(shù)關(guān)閉連接
服務(wù)器端
服務(wù)器先要綁定一個(gè)端口進(jìn)行監(jiān)聽(tīng)
每來(lái)一個(gè)客戶端連接就要?jiǎng)?chuàng)建該客戶端的socket連接,因?yàn)榉?wù)器需要區(qū)分每個(gè)客戶端,所以一個(gè)Socket依賴4項(xiàng):服務(wù)器地址、服務(wù)器端口、客戶端地址、客戶端端口來(lái)唯一確定一個(gè)Socket。
實(shí)際應(yīng)用中,并不只有一個(gè)客戶端連接服務(wù)器,因此需要使用進(jìn)程或線程來(lái)處理多個(gè)客戶端的連接
- 創(chuàng)建一個(gè)socket
s = socket.socket(socket.AF_INET, socket.SOCKET_STREAM) - 綁定端口
s.bind(('127.0.0.1', 80))
注意:'127.0.0.1'表示的是本機(jī)的IP地址,80表示端口,當(dāng)端口小于1024時(shí),需要管理員權(quán)限 - 監(jiān)聽(tīng)端口
s.listen(5) # 5表示等待連接的最大客戶端數(shù)量 - 等待連接(該方法會(huì)阻塞,等待接收數(shù)據(jù))
sock, addr = s.accept() # 返回客戶端套接字和地址
代碼示例:
服務(wù)器端
import threading
import socket
def tcplink(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)
s = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
s.bind(("127.0.0.1", 9999))
s.listen(5)
sock, addr = s.accept()
while True:
# 接受一個(gè)新連接:
sock, addr = s.accept()
# 創(chuàng)建新線程來(lái)處理TCP連接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
客戶端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('127.0.0.1', 9999))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 發(fā)送數(shù)據(jù):
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()