python - 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()
推荐阅读
- php - Laravel 模型在 MS SQL 上创建不返回主键
- android - 有没有办法使用 Kotlin(不是 Java)将网页下载到本地存储?
- amazon-web-services - 如何在 AWS RDS Postgresql 13 上设置 wal_level?
- java - Java swing 按标准管理按钮启用/禁用状态的最佳方法
- python - 分数的升序
- okta - Azure B2B 与 Okta 的直接联合
- python - Python 传递函数之前的参数
- html - 如何在内部服务器/网站出现故障时收到通知
- arrays - 如何在 jmespath 中匹配数组名称本身的正则表达式(json 元素字符串正则表达式通配符)
- html - 页面滚动和溢出-x 无法正常工作