【问题标题】:Python: Client-Server Communication - How to receive messages from different clients on the same server port simultaneously?Python:客户端-服务器通信 - 如何同时在同一服务器端口上接收来自不同客户端的消息?
【发布时间】:2015-03-14 16:33:32
【问题描述】:

我正在研究一种客户端-服务器架构,其中多个客户端应将文件传输到正在运行的服务器。我想知道服务器是否可以同时在一个端口上接收来自不同客户端的输入。

到目前为止我的代码:

服务器

import socket
import time

mySocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

# EDIT: This line was added based on @Aleksander Gurin's response below. The problem persists.
mySocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

mySocket.bind( ('localhost', 1234 ) )


mySocket.listen( 2 )

channel, details = mySocket.accept()

while True:

    incoming = channel.recv( 100 )

    if incoming: 
        print "Received >%s<" % incoming
        incoming = ''

客户

import sys
import socket
import time

mySocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) 

mySocket.connect( ('127.0.0.1', 1234) )

counter = 1

while True:
    mySocket.send( "Message %03d from client %s." % (counter, sys.argv[1]) )
    time.sleep(2)
    counter += 1

我正在启动两个客户端实例,如下所示:

./client.py 1 &
./client.py 2 &

然而,到目前为止,我的服务器只接收来自一个客户端的输入:

Received >Message 001 from client 1.<
Received >Message 002 from client 1.<
Received >Message 003 from client 1.<
Received >Message 004 from client 1.<
Received >Message 005 from client 1.<
...

因此,我的问题是:是否也可以在服务器上接收来自第二个客户端的帖子 - 如果可以,如何接收?

P。 S.:我检查了this related SO post,但也无法真正从中提取答案。

【问题讨论】:

    标签: python sockets client-server


    【解决方案1】:

    您需要在bind 套接字之前设置SO_REUSEADDR 套接字选项。这就是所谓的socket-level option。结果服务器会像这样锁定:

    import socket, threading
    
    def handler(s):
        data = "none"
        while len(data):
            data = s.recv(4096)
            print "Data: %s"%(data)
        s.close()
    
    if __name__ == "__main__":
        tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # here you set socket options, this is what you need
        tcpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # than you bind the socket
        tcpsocket.bind(('', 1234))
        tcpsocket.listen(5)
        while True:
            s, (ip, port) = tcpsocket.accept()
            threading.Thread(target = handler, args = (s,)).start()
    

    【讨论】:

    • 感谢您的回复,@Aleksander Gurin。我在上面的代码中添加了关键行 mySocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ......但我仍然看到相同的输出。我忽略了什么吗?是否与使用线程有关(或我的代码中缺少线程)?
    • 另外,我仍然感到困惑(可能有点天真),因为我有一个服务器正在监听特定端口,但它没有接收到发送到该端口的所有数据......谁能请解释第二个客户端发送的帖子最终到达哪里,或者为什么没有通过受监控的端口接收到这些帖子?
    • 顺便说一下,我刚刚检查了你的代码......它产生的输出与我上面的代码相同,即:没有收到客户 2 的帖子!
    • @Pat 单线程服务器一次只能处理一个客户端(除非您使用异步套接字处理程序)。因此,为了处理多个客户端,每个客户端连接需要一个线程。关于我的代码示例,它适用于您的客户并完全按照您的意愿行事。
    • @Aleksander Gurin:谢谢,Aleks!我又检查了一遍,一切正常。之前测试您的代码时不确定我哪里出错了。非常感谢您不厌其烦地详细回复。非常感谢您的帮助!
    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多