【问题标题】:How can I identify two different connections to sockets using python?如何使用 python 识别到套接字的两个不同连接?
【发布时间】:2013-03-05 09:32:37
【问题描述】:

我首先环顾四周,但找不到任何可以回答我的问题的东西。

问题是我正在制作一个小聊天程序。在看了一些教程和一些文档之后,我设法制作了一个这样的聊天程序:

我有一个客户端和一个客户端/服务器。客户端/服务器基本上将自己设置为服务器,也可以回复客户端。

因此,它侦听用户识别的某个端口,然后接受客户端连接。

问题是我决定要稍微改变一下。

而不是拥有客户端/服务器。我想要两个客户端和一个充当两个客户端之间的交换机的服务器。基本上将所有聊天都定向到连接的地址。

这就是我有点难过的地方:

HOST = input("Please define the host IP, if over local, name 'localhost': ")
PORT = int(input("Please define the port to be communicated over: "))
if PORT == False:
    PORT = 4010


s = socket(AF_INET,SOCK_STREAM)#AF_INET and SOCK_STREAM are standard. 
s.bind((HOST,PORT))# The socket is being bound, or assigned, the ip of the server, as well as the communicating port.
s.listen(2)#Accepting only a single connection. EDIT: Now two connections.
conn,addr = s.accept()


print("\nNetwork activity from address: ",addr,)

# Section two: Communications Loop.

问题是 s.listen(2) 已被编辑为采用 2 个连接,但我应该如何管理不同的连接连接,或者为它们分配变量,以便让总机工作?

如果你发现这是一个重复的线程,请发布链接,我会看看我是否可以删除这个,然后先去那里阅读。 (对不起,我之前在这里发帖的经历很糟糕,(因为我不明白的原因投了反对票))

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    listen 参数告诉您有多少连接可以挂起,而不是有多少将被接受。

    您必须使用 select 模块,该模块允许您插入文件描述符列表并检查哪些已准备好输入或输出。

    然后你会得到一个打开的连接列表(最初是空的),加上要传递给 select 的套接字,然后你应该读取数据,将其写入所有其他连接,然后永远循环。

    import select
    
    connections = []
    
    while True:
        rlist,wlist,xlist = select.select(connections + [s],[],[])
        for i in rlist:
            if i == s:
                conn,addr = s.accept()
                connections.append(conn)
                continue
            data = i.recv(1024)
            for q in connections:
                if q != i and q != s:
                    q.send(data)
    

    此代码没有考虑使用非阻塞模式的复杂性,因此一个慢速客户端也会减慢所有其他客户端的速度,但总的来说它应该可以工作。

    【讨论】:

    • 我完全不知道如何执行此操作。您可以向我指出的任何教程或文档都需要我做什么?
    • 呃。有点困惑这是如何工作的。您似乎从一个名为连接的列表开始,该列表最初是空的。 (因为我们没有连接)然后你有一个连续的循环,它执行以下操作:等待可读、等待可写和等待异常条件都将如下所示:等待可读将是 [s] 因为你在等待我们的监听传入数据的套接字。而另外两个是空的。现在我很困惑的是“i”是什么,以及其余部分是如何工作的。
    • 你能告诉我如何添加或识别两个不同的地址吗?所以我想要地址 P 和地址 Q,如果我从地址 P 接收数据,然后我将它发送到 Q,使用 if 函数?
    • 这就是我所做的,它适用于任意数量的连接,而不仅仅是 2 个。
    • 我有点傻。抱歉,我会试着去理解它。
    猜你喜欢
    • 2020-07-15
    • 2011-12-27
    • 2013-09-30
    • 2020-04-16
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多