【python】TCP socket服务器 Demo

目录

一、单线程服务器

二、多线程服务器

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


一、单线程服务器

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

python 复制代码
import socket,binascii

# 创建一个 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定套接字到指定的主机和端口
server_address = ('localhost', 6666)
server_socket.bind(server_address)

# 开始监听连接
server_socket.listen(5)  # 最多同时监听 5 个连接请求

print("等待客户端连接...")

while True:
    # 等待客户端连接
    client_socket, client_address = server_socket.accept()
    print(f"接受来自 {client_address} 的连接")

    # 接收客户端发送的数据
    while True:
        data = client_socket.recv(1024)  # 最多接收 1024 字节的数据
        data_hex = binascii.hexlify(data).decode('utf-8')  # 将二进制数据转换为十六进制字符串
        print(data_hex)

        # 向客户端回复响应数据
        sendData = "1A2B3C"
        client_socket.send(bytes.fromhex(sendData))
        if not data:
            break  # 如果没有数据,退出循环

    # 关闭与客户端的连接
    client_socket.close()
    break

# 关闭服务器套接字
server_socket.close()

客户端测试结果:

服务端测试结果:

二、多线程服务器

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

python 复制代码
import socket,binascii,threading

def thread_HandleClient(client_socket):  # 用于处理与客户端连接后的逻辑
    while True:
        # 接收客户端发送的数据
        data = client_socket.recv(1024)
        data_hex = binascii.hexlify(data).decode('utf-8')  # 将二进制数据转换为十六进制字符串
        print(f"接收到来自 {client_socket.getpeername()} 的数据:{data_hex}")

        if not data:
            break  # 如果没有数据,退出循环

        # 向客户端发送响应数据
        sendData = "1A2B3C"
        client_socket.send(bytes.fromhex(sendData))
        # client_socket.sendall(bytes.fromhex(sendData))

    # 关闭与客户端的连接
    client_socket.close()

# 创建一个 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定套接字到指定的主机和端口
server_address = ('localhost', 6666)
server_socket.bind(server_address)

# 开始监听连接
server_socket.listen(5)  # 最多同时监听 5 个连接请求

print("等待客户端连接...")

while True:
    # 等待客户端连接
    client_socket, client_address = server_socket.accept()
    print(f"接受来自 {client_address} 的连接")

    # 创建一个新线程来处理客户端连接
    client_thread = threading.Thread(target=thread_HandleClient, args=(client_socket,))
    client_thread.start()

客户端测试结果:

服务端测试结果:

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

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

python 复制代码
import socket,threading,binascii,time


def receive_data(client_socket):
    while True:
        try:
            # 接收客户端发送的数据
            data = client_socket.recv(1024)
            data_hex = binascii.hexlify(data).decode('utf-8')  # 将二进制数据转换为十六进制字符串
            print(f"接收到来自 {client_socket.getpeername()} 的数据:{data_hex}")

            if not data:
                break  # 如果没有数据,退出循环

        except Exception as e:
            print(f"接收数据时出现错误:{e}")
            break

    # 关闭与客户端的连接
    client_socket.close()

def send_data(client_socket):
    while True:
        try:
            sendData = "1A2A3A"  # 要发送的数据
            client_socket.sendall(bytes.fromhex(sendData))  # 向客户端发送数据
            time.sleep(1)  # 1s发1条

        except Exception as e:
            print(f"发送数据时出现错误:{e}")
            break

if __name__ == '__main__':
    # 创建一个 TCP 套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定套接字到指定的主机和端口
    server_address = ('localhost', 6666)
    server_socket.bind(server_address)

    # 开始监听连接
    server_socket.listen(5)  # 最多同时监听 5 个连接请求

    print("等待客户端连接...")

    while True:
        # 等待客户端连接
        client_socket, client_address = server_socket.accept()
        print(f"接受来自 {client_address} 的连接")

        # 创建两个新线程分别处理接收和发送操作
        receive_thread = threading.Thread(target=receive_data, args=(client_socket,))
        send_thread = threading.Thread(target=send_data, args=(client_socket,))

        # 启动线程
        receive_thread.start()
        send_thread.start()

客户端测试结果:

服务端测试结果:

相关推荐
Hgfdsaqwr36 分钟前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
开发者小天1 小时前
python中For Loop的用法
java·服务器·python
绾樘1 小时前
RHCE--基于Nginx的Web服务器配置
运维·服务器·nginx
生活很暖很治愈1 小时前
Linux基础开发工具
linux·服务器·git·vim
老百姓懂点AI1 小时前
[RAG实战] 向量数据库选型与优化:智能体来了(西南总部)AI agent指挥官的长短期记忆架构设计
python
喵手3 小时前
Python爬虫零基础入门【第九章:实战项目教学·第15节】搜索页采集:关键词队列 + 结果去重 + 反爬友好策略!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·搜索页采集·关键词队列
Suchadar3 小时前
if判断语句——Python
开发语言·python
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大4 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
喵手4 小时前
Python爬虫零基础入门【第九章:实战项目教学·第14节】表格型页面采集:多列、多行、跨页(通用表格解析)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·表格型页面采集·通用表格解析
步步为营DotNet4 小时前
深度剖析.NET中IHostedService:后台服务管理的关键组件
服务器·网络·.net