我该如何改进这个 "step based" python 聊天服务器和客户端,使其支持两个以上的实例?
How could I improve this "step based" python chat server and client so it supports more than two instances?
这是服务器:
import socket
HOST = '127.0.0.1'
PORT = 4444
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
conn, addr = s.accept()
print addr, 'connected.'
while True:
data = conn.recv(1024)
print '> ', data
reply = raw_input(">> ")
conn.sendall(reply)
if reply == 'bye':
break
conn.close()
这是客户:
import socket
HOST = '127.0.0.1'
PORT = 4444
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
message = raw_input("> ")
s.send(message)
reply = s.recv(1024)
print ">> ", repr(reply)
if message == 'bye':
break
s.close()
升级此代码以支持多个实例的最有效方法是什么,更重要的是:我如何为所有客户端分配名称(昵称)并使客户端可以随时输入?我尝试使用线程,但那是一个巨大的灾难。
多客户端
对于多客户端连接,你需要一些非线性的执行。
您可以使用协程或线程来实现此目的。
Python 3 附带 asyncio 库,该库使用协程(和许多其他功能)来 模拟 多线程。我建议你看看这个。
也可以用线程,没那么复杂。每当客户端连接到您的服务器时,您只需创建一个新线程来执行您的功能。 Python official documentation 应该可以帮助您实现这一目标。
昵称
每当客户端连接到您的服务器时,您可以使用您的客户端信息在新创建的线程中实例化一个 User 对象,这样每个线程都有自己的 User 实例。
这是服务器:
import socket
HOST = '127.0.0.1'
PORT = 4444
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
conn, addr = s.accept()
print addr, 'connected.'
while True:
data = conn.recv(1024)
print '> ', data
reply = raw_input(">> ")
conn.sendall(reply)
if reply == 'bye':
break
conn.close()
这是客户:
import socket
HOST = '127.0.0.1'
PORT = 4444
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
message = raw_input("> ")
s.send(message)
reply = s.recv(1024)
print ">> ", repr(reply)
if message == 'bye':
break
s.close()
升级此代码以支持多个实例的最有效方法是什么,更重要的是:我如何为所有客户端分配名称(昵称)并使客户端可以随时输入?我尝试使用线程,但那是一个巨大的灾难。
多客户端
对于多客户端连接,你需要一些非线性的执行。 您可以使用协程或线程来实现此目的。
Python 3 附带 asyncio 库,该库使用协程(和许多其他功能)来 模拟 多线程。我建议你看看这个。
也可以用线程,没那么复杂。每当客户端连接到您的服务器时,您只需创建一个新线程来执行您的功能。 Python official documentation 应该可以帮助您实现这一目标。
昵称
每当客户端连接到您的服务器时,您可以使用您的客户端信息在新创建的线程中实例化一个 User 对象,这样每个线程都有自己的 User 实例。