python tcp通信服务端


我想要开发一个python的tcp服务端软件,这个软件是个转发机,可以启动的时候把自己当成一个客户端去TCP连接第三方软件服务端;同时自己作为一个tcp服务端等待其他终端的连接,支持大量设备同时连接。

        假如有终端连接的时候可以将终端发送的数据及时给这个终端进行响应回复,终端连接的时候首先会发送登陆,然后会定时发送信息报文。

        假如第三方软件服务端发送主动查询信息的报文时,这个转发机可以将查询信息的报文给第三方想要查询的对象 终端进行发送,然后等对象终端回复了,将回复的结果给第三方,如果终端没有回复则回复终端无响应给第三方。

大体的效果流程图如下:

img

 这个服务端转发机怎么能实现监听其他终端连接的同时,有数据中心发来命令,立即把这个命令发给命令里要求给的某个终端,

建个list,每有一个客户端连接进来,就把客户端加入list
有命令的时候就遍历list去看到底要发给谁
如果客户端断开连接,就把它从list里移除

你的这个架构设计是一个网关的模型,网络前端维护终端客户端和服务器的tcp连接和心跳,比如客户端的socket的fd是10000,那么你创建一个映射关系给这个终端生成一个序列号 100002, 加一个字典映射关系 100002->10000,当终端有登录请求的时候,你就知道当前的终端是100002,然后你去请求数据中心(同步或者异步都可以,你把终端的序列号透传给相关的回调函数里),等待他应答之后,你从透传过来的终端序列号就知道是要给哪个终端回包,所以从字典里查找你就知道对应的socket,然后给socket发送返回即可

如果并发量和实时响应要求不高的话,可以直接建立一个队列,来一个客户端查询命令就去第三方软件查询,等他返回了数据再返回给客户端。就把它当作一对一处理,处理完了再去队列里面处理另外一个客户端命令,类似计算机操作系统里面的“先来先服务”进程调度算法

客户端

from doctest import SkipDocTestCase
import socket
from urllib import response

from black import target_version_option_callback

target_host = "127.0.0.1"
target_port = 9998

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect((target_host, target_port))

client.send(b"GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n")

response = client.recv(4096)

print(response.decode())
client.close()



该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
您可以使用Python的socket模块来实现TCP服务端。为了实现您的需求,您需要在服务端使用多线程或异步IO来处理多个客户端的连接和请求。

以下是一个简单的TCP服务端示例,支持多个客户端同时连接,并通过多线程来处理每个客户端的请求。

import socket
import threading
 
HOST = '127.0.0.1'  # 监听所有的IP地址
PORT = 8888        # 监听的端口号
 
def handle_client(conn, addr):
    # 处理客户端连接
    print('New client connected:', addr)
    while True:
        data = conn.recv(1024)  # 从客户端接收数据
        if not data:
            break
        # 处理数据
        # ...
        # 向客户端发送响应
        conn.sendall(data)
    # 关闭连接
    conn.close()
    print('Client disconnected:', addr)
 
def start_server():
    # 创建TCP套接字
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        # 绑定地址和端口
        s.bind((HOST, PORT))
        # 开始监听
        s.listen(5)
        print('Server started on {}:{}'.format(HOST, PORT))
        while True:
            # 等待客户端连接
            conn, addr = s.accept()
            # 创建新线程来处理客户端请求
            t = threading.Thread(target=handle_client, args=(conn, addr))
            t.start()
 
if __name__ == '__main__':
    start_server()

handle_client函数中,您可以处理客户端发送的数据,并向客户端发送响应。在start_server函数中,您可以使用socket模块的listen方法来开始监听客户端连接。当有新的客户端连接时,您可以创建一个新的线程来处理客户端请求。

对于您的需求,您需要在handle_client函数中添加一些逻辑来实现数据转发。例如,您可以使用一个字典来维护连接的客户端列表,并在收到第三方软件服务端发送的查询信息报文时,向指定的终端发送请求,然后将终端的响应发送给第三方软件服务端。具体的实现方式取决于您的具体需求和数据格式。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7467120
  • 除此之外, 这篇博客: Tcp多人聊天C#,Unity实现中的 总结:这个Demo主要是设计到Tcp的通讯,一个简单的消息派发,并没有用委托去做,我觉得主要的难点就是在具体信息操作类的逻辑的编写,对于通讯协议也定义的比较简单,没有做粘包的处理,在这里只是多人聊天,如果要进行一对一的聊天,需要写一个数据类,其中包含用户的名字,用户的套接字,然后服务器进行用户存储的时候存储数据类的实例即可,发送的时候也是要一起发送,客户端接受的时候也要一起存起来,实现点击不同的人进行一对一的聊天哦。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

首先,可以使用Python的socket模块来实现TCP通信服务端的开发。具体步骤如下:

  1. 创建socket对象
    使用socket模块的socket函数可以创建一个socket对象,指定socket类型和地址族。例如:
    ```
    import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

其中,AF_INET表示IPv4地址族,SOCK_STREAM表示TCP连接。

2. 绑定地址和端口号
使用socket对象的bind方法可以将socket绑定到指定的IP地址和端口号上。例如:

sock.bind(('0.0.0.0', 8888))

其中,'0.0.0.0'表示可以接收来自任意IP地址的连接请求,8888表示绑定的端口号。

3. 监听连接请求
使用socket对象的listen方法可以开始监听连接请求。例如:

sock.listen(5)

其中,5表示允许同时连接的最大客户端数量。

4. 接受连接请求
使用socket对象的accept方法可以接受来自客户端的连接请求,并返回一个新的socket对象和客户端的地址信息。例如:

client_sock, client_addr = sock.accept()

其中,client_sock是新的socket对象,可以用来与客户端进行通信;client_addr是客户端的地址信息。

5. 发送和接收数据
使用socket对象的sendrecv方法可以发送和接收数据。例如:

client_sock.send(b'Hello, world!')
data = client_sock.recv(1024)

其中,b'Hello, world!'表示要发送的数据,1024表示要接收的数据的最大字节数。

6. 关闭socket
使用socket对象的close方法可以关闭socket。例如:

sock.close()


对于具体的需求,可以在服务端程序中维护一个客户端列表,用来保存已经连接上的终端信息。每当有新的终端连接上来时,将其加入到列表中。当收到来自第三方软件服务端的查询请求时,遍历客户端列表,找到要查询的终端,将查询请求发送给该终端。如果该终端回复了结果,将结果发送给第三方软件服务端;否则,将“终端无响应”发送给第三方软件服务端。

代码示例如下(仅供参考):

```python
import socket
import threading

# 客户端列表,保存已连接的终端信息
client_list = []

# 处理客户端连接的线程函数
def handle_client(client_sock, client_addr):
    print('New client connected:', client_addr)
    # 将新连接的客户端加入到列表中
    client_list.append((client_sock, client_addr))
    while True:
        # 接收客户端发送的数据
        data = client_sock.recv(1024)
        if not data:
            print('Client disconnected:', client_addr)
            # 将断开连接的客户端从列表中移除
            client_list.remove((client_sock, client_addr))
            break
        # TODO: 处理来自客户端的数据
        # 将数据发送回客户端
        client_sock.send(data)

# 启动服务端
def start_server():
    # 创建socket对象
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定地址和端口号
    sock.bind(('0.0.0.0', 8888))
    # 开始监听连接请求
    sock.listen(5)
    print('Server started.')
    while True:
        # 接受连接请求
        client_sock, client_addr = sock.accept()
        # 创建新线程处理连接
        client_thread = threading.Thread(target=handle_client, args=(client_sock, client_addr))
        client_thread.start()

# 发送查询请求给终端
def send_query_to_terminal(terminal_addr, query_data):
    for client_sock, client_addr in client_list:
        if client_addr == terminal_addr:
            # 找到要查询的终端,将查询请求发送给它
            client_sock.send(query_data)
            # 等待终端回复
            data = client_sock.recv(1024)
            if data:
                # 终端回复了结果,将结果发送给第三方软件服务端
                # TODO: 发送数据给第三方软件服务端
            else:
                # 终端没有回复,将“终端无响应”发送给第三方软件服务端
                # TODO: 发送数据给第三方软件服务端
            break

if __name__ == '__main__':
    start_server()

需要注意的是,以上代码仅供参考,还需要根据具体需求进行修改和完善。例如,需要解析来自终端的数据报文,处理来自第三方软件服务端的查询请求,并将查询结果发送给第三方软件服务端。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,我们需要使用Socket模块来实现TCP通信。下面是一个简单的TCP服务端框架,其中包括监听其他终端连接和等待第三方软件服务端连接两个功能:

import socket

# TCP服务端
class TCPServer:
    def __init__(self, port=8888):
        self.host = '' # 绑定所有网卡
        self.port = port
        self.buffer_size = 1024
        self.timeout = 10 # 超时时间为10秒
        self.server_socket = None
        self.client_socket_list = []
        
    # 开始服务
    def start(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象
        self.server_socket.bind((self.host, self.port)) # 绑定地址和端口
        self.server_socket.listen() # 开始监听
        print(f'服务启动成功,监听端口{self.port}...')
        
        while True:
            client_socket, addr = self.server_socket.accept() # 等待客户端连接
            client_socket.settimeout(self.timeout) # 设置客户端socket超时时间
            
            self.client_socket_list.append(client_socket) # 将客户端socket添加到列表中
            
            # 处理客户端请求的线程
            t = threading.Thread(target=self.handle_client_request, args=(client_socket, addr))
            t.start()
          
    # 处理客户端请求的方法
    def handle_client_request(self, client_socket, addr):
        print(f'客户端{addr}连接成功')
        while True:
            try:
                data = client_socket.recv(self.buffer_size) # 接收客户端发送的数据
                if data:
                    # 处理数据
                    self.process_data(client_socket, data)
                else:
                    self.close_client_socket(client_socket, addr)
                    break
            except socket.timeout:
                # 客户端超时连接断开
                self.close_client_socket(client_socket, addr)
                break
                
    # 处理接收到的数据
    def process_data(self, client_socket, data):
        # TODO: 处理数据,根据实际需要实现具体功能
        pass
    
    # 关闭客户端socket
    def close_client_socket(self, client_socket, addr):
        client_socket.close()
        self.client_socket_list.remove(client_socket)
        print(f'客户端{addr}断开连接')

接下来,我们增加处理第三方软件服务端连接和转发消息的功能。

  1. 处理第三方软件服务端连接
# TCP服务端
class TCPServer:
    def __init__(self, port=8888):
        self.host = '' # 绑定所有网卡
        self.port = port
        self.buffer_size = 1024
        self.timeout = 10 # 超时时间为10秒
        self.server_socket = None
        self.third_party_socket = None
        
    # 开始服务
    def start(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象
        self.server_socket.bind((self.host, self.port)) # 绑定地址和端口
        self.server_socket.listen() # 开始监听
        print(f'服务启动成功,监听端口{self.port}...')
        
        while True:
            client_socket, addr = self.server_socket.accept() # 等待客户端连接
            client_socket.settimeout(self.timeout) # 设置客户端socket超时时间
            
            # 判断连接的类型,第三方服务端连接直接保存客户端socket对象,并跳过handle_client_request方法。
            if addr[0] == THIRD_PARTY_HOST and addr[1] == THIRD_PARTY_PORT:
                self.third_party_socket = client_socket
                print(f'第三方服务端连接成功')
                continue
            
            # 其他客户端连接
            # 处理客户端请求的线程
            t = threading.Thread(target=self.handle_client_request, args=(client_socket, addr))
            t.start()

其中,THIRD_PARTY_HOST和THIRD_PARTY_PORT分别为第三方软件服务端的地址和端口。

  1. 转发消息
# TCP服务端
class TCPServer:
    def __init__(self, port=8888):
        self.host = '' # 绑定所有网卡
        self.port = port
        self.buffer_size = 1024
        self.timeout = 10 # 超时时间为10秒
        self.server_socket = None
        self.third_party_socket = None
        self.client_socket_list = []
        
    # 开始服务
    def start(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象
        self.server_socket.bind((self.host, self.port)) # 绑定地址和端口
        self.server_socket.listen() # 开始监听
        print(f'服务启动成功,监听端口{self.port}...')
        
        while True:
            client_socket, addr = self.server_socket.accept() # 等待客户端连接
            client_socket.settimeout(self.timeout) # 设置客户端socket超时时间
            
            # 判断连接的类型,第三方服务端连接直接保存客户端socket对象,并跳过handle_client_request方法。
            if addr[0] == THIRD_PARTY_HOST and addr[1] == THIRD_PARTY_PORT:
                self.third_party_socket = client_socket
                print(f'第三方服务端连接成功')
                continue
            
            # 其他客户端连接
            self.client_socket_list.append(client_socket) # 将客户端socket添加到列表中
            
            # 处理客户端请求的线程
            t = threading.Thread(target=self.handle_client_request, args=(client_socket, addr))
            t.start()
          
    # 处理客户端请求的方法
    def handle_client_request(self, client_socket, addr):
        print(f'客户端{addr}连接成功')
        while True:
            try:
                data = client_socket.recv(self.buffer_size) # 接收客户端发送的数据
                if data:
                    # 处理数据
                    self.process_data(client_socket, data)
                    
                    # 转发消息到第三方服务端
                    if self.third_party_socket:
                        self.third_party_socket.send(data)
                else:
                    self.close_client_socket(client_socket, addr)
                    break
            except socket.timeout:
                # 客户端超时连接断开
                self.close_client_socket(client_socket, addr)
                break
                
    # 处理接收到的数据
    def process_data(self, client_socket, data):
        # TODO: 处理数据,根据实际需要实现具体功能
        pass
    
    # 关闭客户端socket
    def close_client_socket(self, client_socket, addr):
        client_socket.close()
        self.client_socket_list.remove(client_socket)
        print(f'客户端{addr}断开连接')

在处理其他终端连接时,我们将接收到的数据转发到第三方服务端。

完整代码如下:

import socket
import threading

THIRD_PARTY_HOST = 'third_party_host' # 第三方服务端地址
THIRD_PARTY_PORT = 8888 # 第三方服务端端口

# TCP服务端
class TCPServer:
    def __init__(self, port=8888):
        self.host = '' # 绑定所有网卡
        self.port = port
        self.buffer_size = 1024
        self.timeout = 10 # 超时时间为10秒
        self.server_socket = None
        self.third_party_socket = None
        self.client_socket_list = []
        
    # 开始服务
    def start(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象
        self.server_socket.bind((self.host, self.port)) # 绑定地址和端口
        self.server_socket.listen() # 开始监听
        print(f'服务启动成功,监听端口{self.port}...')
        
        while True:
            client_socket, addr = self.server_socket.accept() # 等待客户端连接
            client_socket.settimeout(self.timeout) # 设置客户端socket超时时间
            
            # 判断连接的类型,第三方服务端连接直接保存客户端socket对象,并跳过handle_client_request方法。
            if addr[0] == THIRD_PARTY_HOST and addr[1] == THIRD_PARTY_PORT:
                self.third_party_socket = client_socket
                print(f'第三方服务端连接成功')
                continue
            
            # 其他客户端连接
            self.client_socket_list.append(client_socket) # 将客户端socket添加到列表中
            
            # 处理客户端请求的线程
            t = threading.Thread(target=self.handle_client_request, args=(client_socket, addr))
            t.start()
          
    # 处理客户端请求的方法
    def handle_client_request(self, client_socket, addr):
        print(f'客户端{addr}连接成功')
        while True:
            try:
                data = client_socket.recv(self.buffer_size) # 接收客户端发送的数据
                if data:
                    # 处理数据
                    self.process_data(client_socket, data)
                    
                    # 转发消息到第三方服务端
                    if self.third_party_socket:
                        self.third_party_socket.send(data)
                else:
                    self.close_client_socket(client_socket, addr)
                    break
            except socket.timeout:
                # 客户端超时连接断开
                self.close_client_socket(client_socket, addr)
                break
                
    # 处理接收到的数据
    def process_data(self, client_socket, data):
        # TODO: 处理数据,根据实际需要实现具体功能
        pass
    
    # 关闭客户端socket
    def close_client_socket(self, client_socket, addr):
        client_socket.close()
        self.client_socket_list.remove(client_socket)
        print(f'客户端{addr}断开连接')

# 测试代码
if __name__ == '__main__':
    server = TCPServer()
    server.start()

注意,该代码只是一个框架,需要根据实际需要实现具体的功能。
如果我的回答解决了您的问题,请采纳!