【问题标题】:How do I accept TCP and UDP?如何接受 TCP 和 UDP?
【发布时间】:2024-01-15 00:12:01
【问题描述】:

我试图在我的服务器中同时实现 TCP 和 UDP。我可以接受来自客户端的 TCP 或 UDP 端口连接。

例如,我想让代码在一个程序中接受 TCP 和 UDP:

# create a socket
sockTCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP
sockUDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP


# server address to connect to
server_addressTCP = ('localhost', tcp_port)
server_addressUDP = ('localhost', udp_port)


# bind socket to adress and port number 
sockTCP.bind(server_addressTCP)
sockUDP.bind(server_addressUDP)


# wait for connections (clients)
print("Waiting for connections...")
print(" ")
sockTCP.listen(20)

request = ''

while True:
    #TCP
	client_sock, client_addr = sockTCP.accept()
    data, addr = client_sock.recvfrom(1024)

    #UDP
    udp_data, udp_addr = sockUDP.recvfrom(1024)

    # DO SOMETHING WITH DATA.........

    client_sock.close()

【问题讨论】:

  • 你的问题是?
  • 没有 UDP 连接这样的东西,因此也没有接受一个这样的东西。
  • 查看selectors 模块(或仅使用select)。它们可以用作代码中的信号来接受新的 TCP 连接或接收 UDP 数据报

标签: python sockets tcp network-programming udp


【解决方案1】:

如果您想实现一个侦听 UDP 和 TCP 的服务器,则创建侦听器线程:一个用于 UDP,一个用于 TCP 连接。

这是一个同时监听 TCP 和 UDP 端口的服务器示例。

import socket
import threading

tcp_port = udp_port = 1234

def udp_listen(conn):
    while True:
        data = conn.recv(1024)
        if len(data) != 0:
            print("recv:", data)

def tcp_listen(sock):
    while True:
        conn, _ = sock.accept()
        try:
            while True:
                data = conn.recv(1024)
                if len(data) == 0:
                    break
                print("recv:", data)
        except Exception:
            pass
        try:
            conn.close()
        except Exception:
            pass

# create a socket
sockTCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP
sockUDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)   # UDP

# server address to connect to
server_addressTCP = ('localhost', tcp_port)
server_addressUDP = ('localhost', udp_port)

# bind socket to adress and port number 
sockTCP.bind(server_addressTCP)
sockUDP.bind(server_addressUDP)

sockTCP.listen(20)

t1 = threading.Thread(target=tcp_listen, args=(sockTCP,))
t2 = threading.Thread(target=udp_listen, args=(sockUDP,))

print("Waiting for connections...")

t1.start()
t2.start()

t1.join()
t2.join()

【讨论】: