替代socket.accept()方法

时间:2015-12-29 20:48:30

标签: python sockets

在我尝试用Python学习网络时,我创建了一个简单的服务器 - 客户端程序。服务器创建套接字并检查连接,然后向所有连接的实体发送消息。像这样,

import socket,os
ip=''
port=242
sock = socket.socket()
sock.bind((ip,port))
sock.listen(5)
clients=[]
while True:
    clients.append(sock.accept())
    os.system('cls')
    print 'connected to: '
    for client in clients:
        print client[1]
    message=raw_input('> ')
    for client in clients:
        try:
            client[0].send(message)
        except:
            clients.remove(client)

但程序似乎停止,直到收到连接。如果我希望实现聊天的聊天元素,这有点困境。我知道我可以将socket.accept()置于循环之外,但我打算拥有多个客户端(因此.append())。 我提供了我的客户端代码,以防有任何影响。

import socket
port=int(raw_input('enter the socket adress: '))
sock=socket.socket()
sock.connect(('localhost',port))
connected=True
while connected:
    data=sock.recv(1024)
    if data=='#exit':
        connected=False
    else:
        print data

请在撰写回复时考虑到我是一个非常初学者(如果我的程序格式不明显......:'[)

注意:我正在尝试避免使用select()方法,因为我还不了解它。

1 个答案:

答案 0 :(得分:1)

对于服务器来说,接收和管理多个客户端连接有两种常见的方法(可能还有其他不太常见的方法)。

多线程方法

在这种方法中,您的应用程序有两个线程。如果您还没有完成线程的大量工作,那么它大致意味着您的应用程序同时运行两个程序并共享数据。

循环一(接受线程):

  • 等待新连接(例如,致电接受())
  • 添加新的连接到列表

循环二(输入线程):

  • 等待用户输入(例如,调用raw-input())
  • 将输入发送到连接列表中的每个连接

在这种情况下,在新连接到达之前接受块(等待)并不重要,因为这就是该线程所做的全部。请记住,两个循环都共享连接列表,这是需要谨慎处理的事情。谷歌搜索python和线程将为您提供丰富的信息开始。

非阻塞循环方法

在这种方法中,有一个线程循环并检查循环的每次迭代中的各种事物。例如,循环看起来像:

  • 我有等待的新连接吗?
  • 如果是,请处理,如果没有,请继续(不要等待连接)
  • 我有任何用户输入吗?
  • 如果是,请处理,如果没有,请继续(不要等待用户输入)

select()机制与我刚才描述的非常相似,但确实有一些等待。循环更类似于:

  • 等到有趣的事情发生
  • 这是一个有趣的新连接吗?如果是这样,请接受它。
  • 这是一个有趣的新用户输入吗?如果是,请发送。

<强>权衡

这两种方法可以概括为&#34;两个简单的循环同时运行&#34;或者&#34;一个复杂的循环,但没有其他同时运行&#34;。

多线程方法使每个线程的代码保持独立,但必须处理如果两个循环尝试同时访问连接列表会发生什么的问题。单线程方法不必担心这个问题,但结果有点复杂。

这两种方法都提供了有趣的学习机会。