【问题标题】:How do I implement an unlimited number of socket connections in python?如何在 python 中实现无限数量的套接字连接?
【发布时间】:2020-02-02 08:19:51
【问题描述】:

目前,我的代码只允许有限数量的套接字连接。这由变量 No_Of_Connections 决定。

我的问题是:我如何使它不是有限的?这意味着我不必对连接数进行硬编码。当客户端关闭连接时,我还需要能够终止或加入线程。

非常感谢任何帮助。谢谢!

def Main():
    HOST = '192.168.2.9'
    PORT = 65533
    No_Of_Connections = 10

    trds = []

    s = socket(AF_INET, SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(No_Of_Connections)

    print("Server is running on port: " + str(PORT))

    try:
        for i in range(No_Of_Connections):
            c, addr = s.accept()
            clients.append(c)
            t = Thread(target=clientHandler, args=(s, c, addr))
            trds.append(t)
            t.start()

        for t in trds:
            t.join()

    except KeyboardInterrupt:
        print("caught keyboard interrupt in main, exiting")
        s.close()

    except Exception as e:
        print('Socket Server error: ' + str(e))

【问题讨论】:

  • for i in range(No_Of_Connections): 更改为while True:
  • ... 并从s.listen(No_Of_Connections) 中删除 backlog 参数,无论如何都没有必要。
  • @EdWard 如果我这样做,当用户关闭连接时它将如何终止线程?
  • @Clifford 你的意思是把它设置为 s.listen() 而不是 s.listen(no_of_connections)?
  • @MDanial:listen 的参数与您的代码能够接受的连接数完全无关。请参阅 here 以了解此参数的用途。此外,您不能拥有无限数量的套接字,因为操作系统会对此进行限制。但是您至少可以拥有不受应用程序设计限制的数量。

标签: python sockets serversocket


【解决方案1】:

感谢回复!!

我已经根据新的回复编辑了我的代码。

from socket import *
from threading import Thread
from MySQLconnect import *

clients = []


def clientHandler(s, c, addr):
    print(addr, "is Connected")
    msg = 'Connected to server!'
    c.send(msg.encode('utf-8'))
    while True:
        try:
            data = c.recv(2048).decode('utf-8')
            if not data:
                # This occurs if client kills connection
                print('Connection closed by client: ' + str(addr))
                clients.remove(c)
                c.close()
                return
            if data:
                if 'sensor' in data:
                    MYSQL_thread = MySQL_connect()
                    msg = list()
                    # eg: sensor MQ-8 200
                    for word in data.split():
                        msg.append(word)
                    MYSQL_thread.insert_db(msg[1], msg[2])
                    print('Sensor >> ' + data)
                    broadcast_msg(s, c, 'Database updated')
                else:
                    print('Data >> ' + data)
                    broadcast_msg(s, c, data)
        except Exception as e:
            print('clientHandler error: ' + str(e))


def broadcast_msg(s, c, message):
    global clients
    if not isinstance(message, str):
        message = str(message)
    for client in clients:
        if client != s and client != c:
            # Don't send to server and source of message
            try:
                client.send(message.encode('utf-8'))
            except Exception as e:
                print('Broadcast msg error:' + str(e))


def Main():
    HOST = '192.168.1.9'
    PORT = 65533

    trds = []

    s = socket(AF_INET, SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen()

    print("Server is running on port: " + str(PORT))

    try:
        while True:
            c, addr = s.accept()
            clients.append(c)
            t = Thread(target=clientHandler, args=(s, c, addr), daemon=True)
            trds.append(t)
            t.start()

    except (KeyboardInterrupt, SystemExit):
        print("caught keyboard interrupt in main, exiting")
        s.close()

    except Exception as e:
        print('Socket Server error: ' + str(e))
        s.close()


if __name__ == '__main__':
    Main()

【讨论】:

  • 使线程守护线程。它们在主(服务器)线程退出时关闭,不需要加入。它们在线程目标函数返回时结束,因此只需在客户端函数结束之前关闭客户端套接字。
  • @MarkTolonen 感谢您的意见。我已经相应地编辑了我的代码
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2020-01-14
相关资源
最近更新 更多