基于python原生socket的开发实践

【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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值