一、socket通信過程
TCP服務器端創建套接字 --> 綁定IP地址和端口 --> 監聽客戶端連接請求 --> 接收客戶端連接(建立客戶端連接) --> 阻塞直到有客戶端連接 --> 處理請求(通信循環) --> 關閉連接 --> 關閉套接字
TCP客戶端創建套接字 --> 連接服務端IP以及端口 --> 處理請求(通信循環) --> 關閉套接字
二、套接字函數
1.服務端套接字函數
s.bind(address)
將套接字綁定到地址,在AF_INET下,以元組(host,port)的形式表示地址。
s.listen(backlog)
開始監聽TCP傳入連接。backlog指定在拒絕連接之前,操作系統可以掛起的最大連接數量。該值至少為1,大部分應用程序設為5就可以了。
s.accept()
接受TCP連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據。address是連接客戶端的地址。
2.客戶端套接字函數
s.connect(address)
連接到address處的套接字。一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。
3.公共套接字函數
s.recv(bufsize[,flag])
接受TCP套接字的數據。數據以字符串形式返回,bufsize指定要接收的最大數據量。flag提供有關消息的其他信息,通常可以忽略。
s.send(string[,flag])
發送TCP數據。將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小於string的字節大小。
s.close()
關閉套接字。
三、代碼實現(版本一)
實現效果:客戶端單方面發送消息,服務端顯示客戶端發送的消息
server. py
import socket
# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定ip地址與端口號
sock.bind(('127.0.0.1', 8080))
# 建立監聽,最大連接數為5個
sock.listen(5)
# 接收客戶端的連接
conn, client_addr = sock.accept()
# 通訊循環
while True:
# 接收消息
msg = conn.recv(1024) # 最大接收字節數為1024
if not msg:
continue
print('client is sending: ' + msg.decode('utf-8'))
# 斷開連接
conn.close()
# 關閉套接字
sock.close()
client. py
import socket
# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務端
sock.connect(('127.0.0.1', 8080))
# 建立通訊循環
while True:
msg = input('Enter your message: ')
if msg == 'quit':
print('communication ended')
break
sock.send(msg.encode('utf-8')) # Mac操作系統使用utf-8編碼方式
# 斷開連接
sock.close()
先運行server,再運行client
運行效果:(p1 client,p2 server)


四、代碼實現(版本二)
服務端客戶端互發消息
server
import socket
# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定ip地址與端口號
sock.bind(('127.0.0.1', 8081))
# 建立監聽,最大連接數為5個
sock.listen(5)
# 接收客戶端的連接
conn, client_addr = sock.accept()
# 通訊循環
while True:
# 接收消息
msg = conn.recv(1024) # 最大接收字節數為1024
if not msg:
continue
print('client is sending: ' + msg.decode('utf-8'))
reply = input('reply: ')
conn.send(reply.encode('utf-8'))
# 斷開連接
conn.close()
# 關閉套接字
sock.close()
client
import socket
# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務端
sock.connect(('127.0.0.1', 8081))
# 建立通訊循環
while True:
msg = input('Enter your message: ')
if msg == 'quit':
print('communication ended')
break
sock.send(msg.encode('utf-8')) # Mac操作系統使用utf-8編碼方式
reply = sock.recv(1024)
print('server is sending: ' + reply.decode('utf-8'))
# 斷開連接
sock.close()
先運行server,再運行client
運行效果:(p1 client,p2 server)

