首页 > 其他分享 >08. 并发TCP服务器

08. 并发TCP服务器

时间:2023-11-06 17:46:30浏览次数:46  
标签:__ recv 08 tcp connection TCP 服务器 data self

一、并发TCP服务器

  我们使用线程的方式实现并发 TCP 服务器。

from socket import socket
from socket import AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
from time import ctime
from threading import Thread

HOST = "127.0.0.1"
PORT = 8080
ADDRESS = (HOST, PORT)

tcp_server = socket(AF_INET, SOCK_STREAM)               # 创建服务器套接字
tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)      # 解决端口占用问题
tcp_server.bind(ADDRESS)                                # 套接字与地址绑定
tcp_server.listen(5)                                    # 监听连接,最大挂起连接数为5

class TCPServer(Thread):
    def run(self):
        print("waiting for connection...")

        while True:                                     # 监听连接
            connection, address = tcp_server.accept()   # 接收客户端连接
            print("...connection from: ", address)

            # 创建一个新的子线程,专门为刚刚创建的客户端服务
            handle_data_thread = HandleData(connection, address)
            handle_data_thread.start()

    def __del__(self):
        tcp_server.close()                              # 关闭服务器套接字

class HandleData(Thread):
    def __init__(self, connection, address):
        super().__init__()
        self.connection = connection
        self.address = address

    def run(self):
        while True:                                     # 通信循环
            try:
                recv_data = self.connection.recv(1024)  # 服务端接收消息,单次最大接收为1024个字节
                # 在Linux系统中,一旦data收到空,意味着是一种异常的行为:客户端非法断开连接
                if not recv_data:                       # 适用于Linux系统
                    break
                print(f"收到客户端【{self.address}】发送的数据:{recv_data.decode('utf-8')}")
                self.connection.send(f"【{ctime()}】 {recv_data.decode('utf-8')}".encode("utf-8"))  # 服务端发送消息
            except ConnectionResetError:                # 适用于Windows系统
                break

        print(f"客户端【{self.address}】断开连接!")
        self.connection.close()                         # 关闭连接

if __name__ == "__main__":
    server = TCPServer()
    server.start()

二、TCP服务器

from socket import socket
from socket import AF_INET, SOCK_STREAM

HOST = "127.0.0.1"
PORT = 8080
ADDRESS = (HOST, PORT)

tcp_client = socket(AF_INET, SOCK_STREAM)               # 创建客户端套接字
tcp_client.connect(ADDRESS)                             # 尝试连接服务器

while True:                                             # 通信循环
    send_data = input("请输入要发送的数据: ").strip()
    if not send_data:                                   # 按空格、回车等键结束连接
        break
    tcp_client.send(send_data.encode("utf-8"))          # 客户端发送数据,不允许发送空数据

    recv_data = tcp_client.recv(1024)                   # 客户端接收数据,单次最大接收为1024个字节
    if not recv_data:
        break
    print(f"收到服务端【{ADDRESS}】返回的数据:{recv_data.decode('utf-8')}")

tcp_client.close()                                      # 关闭客户端套接字

标签:__,recv,08,tcp,connection,TCP,服务器,data,self
From: https://www.cnblogs.com/kurome/p/17813287.html

相关文章

  • Run tomcat on port 80 not 8080
    HowtorunTomcatonPort80AstandardTomcatinstallationstartsthewebserveronport8080–whichisusuallynotthedesiredbehavior.Inordertochangetheservertoport80therearetwooptionswhichIoutlineinthefollowing:Recommended:redirect......
  • 阿贝云服务器哪个好用免费
    随着云计算技术的发展,越来越多的企业和个人开始寻找一款性价比高且功能全面的云服务器,阿贝云作为一个具备高性能、可靠性、安全性和强大扩展性的云服务器厂商,备受云计算用户们的关注。那么,阿贝云服务器哪个好用免费呢?下面将为大家介绍阿贝云服务器的免费使用情况。 一、阿贝云......
  • gitlab服务器在没有备份的情况下宕机,如何恢复项目代码
    第一步:复制旧服务器的代码仓库数据将宕机的gitlab服务器硬盘挂载到其他服务器,打开挂载的磁盘,找到gitlab代码仓库目录  /run/media/root/c6e4af86-0ca5-4841-8593-914811388435/var/opt/gitlab/git-data黄色部分是磁盘挂载的目录,后面的/var/opt/gitlab/git-data这个是gitlab......
  • Jtti:服务器的常见用途有哪些
    服务器是计算机网络中的关键组件,用于多种用途,以下是一些常见的服务器用途:Web服务器:用于托管网站和应用程序,响应来自互联网的HTTP请求,向用户提供网页内容。文件服务器:用于存储和共享文件,员工可以通过网络访问和共享文件和数据。电子邮件服务器:处理和存储电子邮件,以便用户可以发送、......
  • '/webhook'​​​是你的服务器上的一个路径,当有人发送POST请求到这个路径时,​​webhoo
    在这段代码中,'/webhook'是你的服务器上的一个路径,当有人发送POST请求到这个路径时,webhook()函数就会被调用。你可以根据你的需求来选择这个路径,只要它在你的服务器上是唯一的。例如,如果你的服务器的URL是http://myserver.com,那么当飞书机器人发送POST请求到http://myserver.com/web......
  • STC8H1K08开发环境搭建
    目的: 主要记录STC8H系列芯片开发环境的搭建,以便以后再次用到该芯片时,直接看这篇博文就可以了,不要再去摸索一遍了。过程:1关于编译器KEIL5 FORC51:1.1STC芯片开发相关软件设置   官网上下载KEIL5FOR51和注册机,安装、破解后,添加STC芯片支持包。如果不安装芯片支持......
  • TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?
    引言在之前的讲解中,我们已经介绍了TCP协议的一些面试内容,相信大家对于TCP也有了一些新的了解。今天,我们将继续深入探讨TCP的超时重传、流量控制、TCP的keepalive机制以及端口号等相关信息。这些内容对于理解TCP协议的工作原理和实际应用非常重要,希望可以加深大家对TCP协议的理解......
  • TCP三次握手的机制
    工作原理描述1)客户端主动向服务器端发送请求SYN(SynchronizeSequenceNumbers),发送SYN=1,seq=n(随机序号)2)服务器端接收到请求后,进行确认,回复SYN=1,ACK=n+1(确认),seq=k(随机序号)3)客户端进行确认,回复SYN=1,ACK=k+1(确认),seq=n+1为什么需要三次握手TCP(transmissioncontrolprotocol)是可靠......
  • #2023-2024-1 20231408《计算机基础与程序设计》第六周学习总结
    作业信息这个作业属于哪个课程<2023-2024-1-计算机基础与程序设计>这个作业要求在哪里<2023-2024-1计算机基础与程序设计第六周作业>这个作业的目标<《计算机科学概论》第七章,《C语言程序设计》第五章,上周测试题>作业正文教材学习内容总结Polya的“如何......
  • 2023.08.12-美团-第五题-树上染色
    给定一棵树,每个节点都有一个权值以及最开始是白色。定义操作A:选择两个有边直接相连的节点,可以将两个节点同时染红.当且仅当他们都是白色但是这样的题目太过简单,所以我们定义一个更复杂的操作B:在满足操作A的条件下两个节点的权值的乘积也需要是x∗x的形式,现在允许执行操作若......