【python】TCP socket服务器 Demo

news2024/11/25 2:19:31

目录

一、单线程服务器

二、多线程服务器

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


一、单线程服务器

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

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()

客户端测试结果:

服务端测试结果:

二、多线程服务器

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

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()

客户端测试结果: 

服务端测试结果:

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

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

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()

客户端测试结果: 

服务端测试结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++基础】4、变量

文章目录 【 1、变量的定义 】【 2、变量的声明 】示例 【 3、左值和右值 】 变量:相当于是程序可操作的数据存储区的名称。在 C 中,有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局&am…

文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)

作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。 本文讲解了 Java 设计模式中的原型模式,并给…

python3

#安装python3 brew install python3 看到下图表示安装python3成功: #将python3 加入环境变量 export PATH$PATH:/opt/homebrew/bin/#查看python 版本 python3 --version#查看pip 版本 pip3 --version#更新python源 pip3 config set global.index-url https://pypi.tuna.tsing…

免费电商api接口,分享给你「建议收藏」

API(应用程序编程接口) ​ API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组…

高忆管理;三天翻倍!地产“三仙”狂飙

9月6日,一度全部成为“仙股”的三家闻名香港上市房企,融创我国、我国恒大、碧桂园大涨。其间两家已顺利摘掉“仙股”帽子。 截至发稿,融创我国涨20.25%,报1.9港元/股,总市值报104亿港元,不到三个交易日股价…

[LeetCode周赛复盘] 第 361 场周赛20230906

[LeetCode周赛复盘] 第 361 场周赛20230906 一、本周周赛总结2843. 统计对称整数的数目1. 题目描述2. 思路分析3. 代码实现 2844. 生成特殊数字的最少操作1. 题目描述2. 思路分析3. 代码实现 2845. 统计趣味子数组的数目1. 题目描述2. 思路分析3. 代码实现 2846. 边权重均等查…

提升客户体验,你只需要做到这一点

自动回复是指由特定事件或操作触发的自动响应,例如在即时通讯工具上接收消息,它用于通知发件人他们的消息已被收到。不仅可以在WhatsApp,Messenger等渠道上设置自动回复,如果您使用了像SaleSmartly(SS客服)…

任意文件读取及漏洞复现

文章目录 渗透测试漏洞原理任意文件读取1. 任意文件读取概述1.1 漏洞成因1.2 漏洞危害1.3 漏洞分类1.4 任意文件读取1.4.1 文件读取1.4.2 任意文件读取1.4.3 权限问题 1.5 任意文件下载1.5.1 一般情况1.5.2 PHP实现1.5.3 任意文件下载 2. 任意文件读取攻防2.1 路径过滤2.1.1 过…

无需麻烦验证,文字验证码一键通过

前言 文字验证码,简单易用,安全可靠!不需要麻烦的图形识别。这种验证方式不仅方便快捷,而且能有效防止恶意攻击和机器人访问。无需担心复杂操作,只需几秒钟就能完成验证过程。保护您的个人信息和数据安全,…

PG 的状态机和peering过程

首先来解释下什么是pg peering过程? 当最初建立PG之后,那么需要同步这个pg上所有osd中的pg状态。在这个同步状态的过程叫做peering过程。同样当启动osd的时候,这个osd上所有的pg都要进行peering过程,同步pg的状态。peering过程结…

【K 均值聚类】02/5:简介

一、说明 k-mean算法是一种聚类算法,它的主要思想是基于数据点之间的距离进行聚类。K-means聚类是一种无监督的机器学习算法。让我们再解释一下这句话。聚类分析的目标是将数据划分为同类聚类。每个聚类中的点彼此之间比其他聚类中的点更相似。 无监督机器学习是在没…

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群,其中有三个master 节点,这三个节点的标签名称为etcd 三个master节点的ip 分别为:192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库, 数据库的ip 为:192.165.187.180 用户…

Java虚拟机整型数加载指令学习

JVM中 int 类型数值,根据 取值范围将 入栈的 字节码指令 就分为4类: 取值 -1~5 采用 iconst 指令; 取值 -128~127 采用 bipush 指令; 取值 -32768~32767 采用 sipush指令; 取值 -2147483648~2147483647 采用 ldc 指令。…

pyppeteer模块常用方法

目录 await page.方法 设置相关 setUserAgent(str) setCookie(cookie1, cookie2.......) 页面相关 goto(url) reload() goBack()/goForward() 执行js evaluate(js_str) 截图 screenshot(dict) 保存pdf pdf(dict) 获取内容 content() co…

Fragment的创建分析

之前的文章讨论了Fragment的销毁流程,初始状态为resume,然后经历pause -> stop -> destroyView -> destroy -> detach这么几个流程(本篇文章基于Support27.1.1来分析的)。清楚了Fragment的销毁,那也来看看…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…

CTFHUB ICS(1)

1.异常的工程文件 把文件拖到kali里面去了 unzip 文件名解压文件 文件很多,我们先进到解压的文件夹里面 strings $(find . | xargs) | grep flag linux命令的作用是在当前目录及子目录下递归查找文件,提取文件中的字符串,然后用grep过滤 find . - 在当前目录及递…

cadence virtuoso bandgap温漂公式

先仿真温漂,然后将曲线send to calculate。 调用ymax,ymin,average函数。

PGInfo核心字段详解

PGInfo存在于PG的整个生命周期中,其在对象数据的写入、数据恢复、PG Peering过程中均发挥重要的作用。本章试图研究pg info在整个PG生命周期中的变化过程,从而对PG及PGInfo有一个更深入的理解。 class PG : DoutPrefixProvider { public:// pg statepg_…

Unable to remove Temporary User Data

错误截图 原因 项目的临时数据目录是存在了未授权的盘符,当删除它的时候,遇到了权限问题,没有权限没法删除。 解决方法 增加字段:userDataDir 解决