首页 > 解决方案 > 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

标签: pythonpython-3.x

解决方案


要使用线程,您可以简单地等待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()

推荐阅读