1. 客戶端
# 1 創建套接字對象
import socket
# IPV4/TCP 協議
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2 和服務器端建立連接
tcp_client_socket.connect(('192.168.1.10',8080))
# 3 發送數據,必須是字節流
# encode(把字符串轉為bytes) decode(把bytes轉為字符串)
while True:
data = input('發送')
if data != '*':
data = data.encode('gbk')
tcp_client_socket.send(data)
# 4 接收服務器返回的數據 recv(字節大小)
recv_data = tcp_client_socket.recv(1024).decode('gbk')
print('服務器:', recv_data)
# 5 關閉套接字對象
else:
tcp_client_socket.close()
exit()
2. 服務器端
# 導入socket和threading
import socket
import threading
# 定義handle_client_request 循環以保持與客戶端的連接,並能持續互相傳遞消息
def handle_client_request(service_client_socket,ip_port):
while True:
# 5 接收數據,最大接收為1024字符
recv_data = service_client_socket.recv(1024)
if recv_data:
print(recv_data.decode('gbk'),ip_port) # 將二進制格式轉換為'gbk'
# 6 服務器返回數據
back = f'自動回復:歡迎,您發送的數據為{recv_data.decode("gbk")}'
service_client_socket.send(back.encode('gbk')) # 將'gbk'格式轉換為二進制
else:
print('客戶端下線',ip_port)
break
# 7 關閉套接字對象
service_client_socket.close()
if __name__ == '__main__':
# 1 創建套接字對象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 設置端口號復用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2 綁定IP和端口,ip不寫或寫'127.0.0.1'都是主機本身
tcp_server_socket.bind(('',8080))
# 3 設置監聽,一般為5,最大為128
tcp_server_socket.listen(5)
while True:
# 4 接收客戶端套接字對象
service_client_socket, ip_port = tcp_server_socket.accept()
# 創建線程,傳入套接字對象數據
sub_thread = threading.Thread(target=handle_client_request,args=(service_client_socket,ip_port))
# 守護主線程
sub_thread.setDaemon(True)
# 運行線程
sub_thread.start()