在我尝试用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()
方法,因为我还不了解它。
答案 0 :(得分:1)
对于服务器来说,接收和管理多个客户端连接有两种常见的方法(可能还有其他不太常见的方法)。
多线程方法
在这种方法中,您的应用程序有两个线程。如果您还没有完成线程的大量工作,那么它大致意味着您的应用程序同时运行两个程序并共享数据。
循环一(接受线程):
循环二(输入线程):
在这种情况下,在新连接到达之前接受块(等待)并不重要,因为这就是该线程所做的全部。请记住,两个循环都共享连接列表,这是需要谨慎处理的事情。谷歌搜索python和线程将为您提供丰富的信息开始。
非阻塞循环方法
在这种方法中,有一个线程循环并检查循环的每次迭代中的各种事物。例如,循环看起来像:
select()机制与我刚才描述的非常相似,但确实有一些等待。循环更类似于:
<强>权衡强>
这两种方法可以概括为&#34;两个简单的循环同时运行&#34;或者&#34;一个复杂的循环,但没有其他同时运行&#34;。
多线程方法使每个线程的代码保持独立,但必须处理如果两个循环尝试同时访问连接列表会发生什么的问题。单线程方法不必担心这个问题,但结果有点复杂。
这两种方法都提供了有趣的学习机会。