Python:接受列表中的连接,并让用户选择要写入的特定套接字?



Python:接受列表中的连接,并让用户选择要写入的特定套接字?

我想编写一个简单的 Python 服务器,它接受传入连接,将它们存储到列表中,并具有一个允许用户选择要写入的套接字的用户界面。

因此,当服务器接受新连接并将接收到的数据打印到屏幕时,用户应具有如下所示的 UI:

> select 2 # select connection 2
> helloworld # writes 'helloworld' to the socket

如何使用线程或子进程执行此操作?(最好的方法是什么?

奖励:我该怎么做,收到的数据不会弄乱 UI 提示?

这是我使用select.select()的代码:

#!/usr/bin/env python3
import os
import sys
import select
import socket
TCP_IP = '0.0.0.0'
TCP_PORT = 80
BUF_SZ = 1024
sock_list = []
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((TCP_IP,TCP_PORT))
server.listen(10)
inputs = [server]
outputs = []
while True:
read_socks, write_socks, error_socks = select.select(inputs, outputs, inputs)
for sock in read_socks:
if sock is server:
conn,addr = server.accept()
inputs.append(conn)
print('Connection %s' % conn)
else:
data = sock.recv(BUF_SZ)
print(data)
for sock in write_socks:
None

要使用线程,您只需等待socket.accept(),当您收到新连接时,请使用新线程处理它。示例代码可以是这样的:

import socket
import sys
import threading

def worker(conn, ip, port, max_buffer_size=4096):
print('accepting connection from ip={} and port={}'.
format(ip, port, conn))
data = conn.recv(max_buffer_size)
# Do something
conn.close()

def init_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen(PARALLEL_CONNECTIONS)
return server_socket

def run():
try:
s = init_server()
print('successfully created server socket.')
except Exception as e:
print('failed to create socket because {}'.format(e))
sys.exit()
while True:
clientsocket, addr = s.accept()
ip, port = str(addr[0]), str(addr[1])
t = threading.Thread(target=worker, args=(clientsocket, ip, port,))
t.start()

最新更新