• 【python】TCP socket服务器 Demo


    目录

    一、单线程服务器

    二、多线程服务器

    三、多线程服务器(发送和接收分离)


    一、单线程服务器

    说明:只能连接一个客户端

    1. import socket,binascii
    2. # 创建一个 TCP 套接字
    3. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    4. # 绑定套接字到指定的主机和端口
    5. server_address = ('localhost', 6666)
    6. server_socket.bind(server_address)
    7. # 开始监听连接
    8. server_socket.listen(5) # 最多同时监听 5 个连接请求
    9. print("等待客户端连接...")
    10. while True:
    11. # 等待客户端连接
    12. client_socket, client_address = server_socket.accept()
    13. print(f"接受来自 {client_address} 的连接")
    14. # 接收客户端发送的数据
    15. while True:
    16. data = client_socket.recv(1024) # 最多接收 1024 字节的数据
    17. data_hex = binascii.hexlify(data).decode('utf-8') # 将二进制数据转换为十六进制字符串
    18. print(data_hex)
    19. # 向客户端回复响应数据
    20. sendData = "1A2B3C"
    21. client_socket.send(bytes.fromhex(sendData))
    22. if not data:
    23. break # 如果没有数据,退出循环
    24. # 关闭与客户端的连接
    25. client_socket.close()
    26. break
    27. # 关闭服务器套接字
    28. server_socket.close()

    客户端测试结果:

    服务端测试结果:

    二、多线程服务器

     说明:可以支持连接多个客户端

    1. import socket,binascii,threading
    2. def thread_HandleClient(client_socket): # 用于处理与客户端连接后的逻辑
    3. while True:
    4. # 接收客户端发送的数据
    5. data = client_socket.recv(1024)
    6. data_hex = binascii.hexlify(data).decode('utf-8') # 将二进制数据转换为十六进制字符串
    7. print(f"接收到来自 {client_socket.getpeername()} 的数据:{data_hex}")
    8. if not data:
    9. break # 如果没有数据,退出循环
    10. # 向客户端发送响应数据
    11. sendData = "1A2B3C"
    12. client_socket.send(bytes.fromhex(sendData))
    13. # client_socket.sendall(bytes.fromhex(sendData))
    14. # 关闭与客户端的连接
    15. client_socket.close()
    16. # 创建一个 TCP 套接字
    17. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    18. # 绑定套接字到指定的主机和端口
    19. server_address = ('localhost', 6666)
    20. server_socket.bind(server_address)
    21. # 开始监听连接
    22. server_socket.listen(5) # 最多同时监听 5 个连接请求
    23. print("等待客户端连接...")
    24. while True:
    25. # 等待客户端连接
    26. client_socket, client_address = server_socket.accept()
    27. print(f"接受来自 {client_address} 的连接")
    28. # 创建一个新线程来处理客户端连接
    29. client_thread = threading.Thread(target=thread_HandleClient, args=(client_socket,))
    30. client_thread.start()

    客户端测试结果: 

    服务端测试结果:

    三、多线程服务器(发送和接收分离)

    说明: 可以支持连接多个客户端,并且能够做到和多个客户端发送、接收信息同时进行

    1. import socket,threading,binascii,time
    2. def receive_data(client_socket):
    3. while True:
    4. try:
    5. # 接收客户端发送的数据
    6. data = client_socket.recv(1024)
    7. data_hex = binascii.hexlify(data).decode('utf-8') # 将二进制数据转换为十六进制字符串
    8. print(f"接收到来自 {client_socket.getpeername()} 的数据:{data_hex}")
    9. if not data:
    10. break # 如果没有数据,退出循环
    11. except Exception as e:
    12. print(f"接收数据时出现错误:{e}")
    13. break
    14. # 关闭与客户端的连接
    15. client_socket.close()
    16. def send_data(client_socket):
    17. while True:
    18. try:
    19. sendData = "1A2A3A" # 要发送的数据
    20. client_socket.sendall(bytes.fromhex(sendData)) # 向客户端发送数据
    21. time.sleep(1) # 1s发1条
    22. except Exception as e:
    23. print(f"发送数据时出现错误:{e}")
    24. break
    25. if __name__ == '__main__':
    26. # 创建一个 TCP 套接字
    27. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    28. # 绑定套接字到指定的主机和端口
    29. server_address = ('localhost', 6666)
    30. server_socket.bind(server_address)
    31. # 开始监听连接
    32. server_socket.listen(5) # 最多同时监听 5 个连接请求
    33. print("等待客户端连接...")
    34. while True:
    35. # 等待客户端连接
    36. client_socket, client_address = server_socket.accept()
    37. print(f"接受来自 {client_address} 的连接")
    38. # 创建两个新线程分别处理接收和发送操作
    39. receive_thread = threading.Thread(target=receive_data, args=(client_socket,))
    40. send_thread = threading.Thread(target=send_data, args=(client_socket,))
    41. # 启动线程
    42. receive_thread.start()
    43. send_thread.start()

    客户端测试结果: 

    服务端测试结果: 

  • 相关阅读:
    springboot基于JAVA的“三味书屋”网络书店销售管理系统的设计与实现毕业设计源码111519
    懒人福音:Java版Webhook机器人,一键开启‘躺赢’模式
    Linux友人帐之系统管理与虚拟机相关
    车规级MCU进入「新周期」,中国本土供应商竞逐竞争力TOP10
    ThingsBoard教程(二八):详细讲解在tb平台下 mqtt协议下的 rpc 遥测,客户端rpc,服务的rpc的使用 ,与node-red联动
    Java 新手如何使用Spring MVC RestAPI的加密
    【安卓13-Framework】SystemUI定制之屏蔽下拉状态栏部分快捷按钮
    【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
    从Purge机制说起,详解GaussDB(for MySQL)的优化策略
    java毕业设计校园二手交易网站源码+lw文档+mybatis+系统+mysql数据库+调试
  • 原文地址:https://blog.csdn.net/ChaoChao66666/article/details/132715445