【server端】
# 导入模块
import socket
import threading
from count_tools.count_tool import show_results # 这是自己写了一套计算结果的函数集
import json
import struct
# 接收消息
def recv(client_socket, ip_port):
while True: # 如果有客户端连接的话 ,继续执行
recv_header = client_socket.recv(4)
recv_client_text = ''
if recv_header:
recv_header_size = struct.unpack('i', recv_header)[0]
print("每次收到的报头", recv_header_size)
# 如果内容长度等于4,说明是心跳程序
if recv_header_size==4:
print("心跳数据报头大小 ====》 ", recv_header_size)
# 接收来自客户端的心跳数据
heart_data = client_socket.recv(recv_header_size).decode('utf8')
print("心跳数据内容为 ====》 ", heart_data)
# 将心跳数据封装成报头
heart_data_size = struct.pack('i', len(heart_data))
# 发送心跳数据报头
client_socket.send(heart_data_size)
# 发送心跳数据
client_socket.send(heart_data.encode('utf8'))
print("[发送]心跳数据内容为 ====》 ", heart_data)
# 如果内容长度等于9,说明是前端测试数据
elif recv_header_size == 20:
print("前端测试数据报头大小 ====》 ", recv_header_size)
# 接收来自客户端的心跳数据
test_data = client_socket.recv(1024).decode('utf8')
print("前端测试数据内容为 ====》 ", test_data)
# 将测试数据封装成报头
test_data_size = struct.pack('i', len(test_data))
# 发送心跳数据报头
client_socket.send(test_data_size)
# 发送心跳数据
client_socket.send(test_data.encode('utf8'))
print("[发送]测试数据内容为 ====》 ", test_data)
# 否则内容是 测算数据
else:
# print("client_socket.recv(1024).decode('utf8')", struct.unpack('i', client_socket.recv(1024))[0])
while len(recv_client_text) < recv_header_size: # 如果还能接收到客户端数据的话,继续执行
recv_client_text += client_socket.recv(1024).decode('utf8')
# print("[客户端消息===》]", ip_port, ":", recv_client_text)
print("收到内容 ------>",type(recv_client_text), recv_client_text)
data = json.loads(recv_client_text) # 将接收到的string数据转化为dict数据
datas = show_results(data=data) # 将dict数据传递给计算器函数
print('type(datas)=====>', type(datas))
# datas="处理过" + client_text.decode('utf8')
# d = client_text.decode('utf8') + " 你是猪嘛???"
d = str(datas)
print("向客户端发送的数据:", d)
# 给客户端响应
# client_socket.send(("计算后的值: "+d).encode('utf8'))
data_size = struct.pack('i', len(d))
client_socket.send(data_size)
client_socket.send(d.encode('utf8'))
# 当客户端断开连接时,会一直发送''空字符串,所以长度为0已下线
else:
print("[客户端]", ip_port, "已下线")
# client_socket.shutdown(2)
# client_socket.close()
break
# 程序主入口
def main():
# 创建TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 【 开始 】想设置自动重连,但并没有效果
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
TCP_KEEPALIVE = 0x10
interval_sec = 30 * 1000
# tcp_sock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1)
tcp_socket.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec)
# 【 结束 】结束重连
# 绑定端口
tcp_socket.bind(("", 8000))
# 设置为被动监听状态,128表示最大连接数
tcp_socket.listen(128)
while True:
# 等待客户端连接
print("111111")
client_socket, ip_port = tcp_socket.accept()
print("[新客户端]:", ip_port, "已连接")
# 有客户端连接后,创建一个线程将客户端套接字,IP端口传入recv函数,
t1 = threading.Thread(target=recv, args=(client_socket, ip_port))
# 设置线程守护
t1.setDaemon(True)
# 启动线程
t1.start()
t1.join()
print("ending -----")
if __name__ == '__main__':
main()
【client端】
from socket import *
import threading
tcp_socket = socket(AF_INET, SOCK_STREAM)
tcp_socket.connect(('127.0.0.1', 8000))
true = True
def recv_msg(tcp_socket):
global true
while true:
recv_msg = tcp_socket.recv(1024).decode("utf8")
if recv_msg == "exit":
true = False
print('接收到的信息为:%s\n' % recv_msg)
def send_msg(tcp_socket):
global true
while true:
send_msg = input('请输入要发送的内容\n')
tcp_socket.send(send_msg.encode('utf-8'))
if send_msg == "exit":
true = False
threading.Thread(target=send_msg, args=(tcp_socket,)).start()
threading.Thread(target=recv_msg, args=(tcp_socket,)).start()