【发布时间】:2017-09-26 14:50:02
【问题描述】:
我正在尝试构建的聊天程序有一个小问题: 有 2 个客户端和一个服务器,一个客户端发送一条消息,服务器接收它,并将其广播给每个人(通常是两个客户端,但可以有更多)。问题是,当一个客户端(通过服务器)向另一个客户端发送数据时,接收客户端必须自己发送一些东西才能看到消息。
这是我的 server.py:
import socket
from thread import start_new_thread
import threading
def thread(c,clients, c_lock,buf=1024,):
c.send("You are connected! \n")
while True:
try:
data = c.recv(buf)
print data
if not data:
break
broadcast(clients,c_lock,data)
except socket.error as e:
exit(0)
c.close()
def broadcast(clients,c_lock,data):
with c_lock:
for c in clients:
c.sendall("- " + data)
def main():
host = ''
port = 10000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clients = set()
clients_lock = threading.Lock()
s.bind((host, port))
s.listen(5)
print "%s listening on %s" % (host, str(port))
while True:
c, addr = s.accept()
print "got connection from ", addr
with clients_lock:
clients.add(c)
start_new_thread(thread, (c, clients, clients_lock, ))
s.close()
if __name__ == "__main__":
main()
还有client.py:
import socket
import time
from sys import exit
def main():
host = socket.gethostname()
port = 10000
name = str(raw_input("Enter your name: "))
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(('192.168.1.12', port))
except Exception as e:
print 'Connection not working... %s' % (e)
exit()
print s.recv(1024) # greeting msg
print "Send q to stop the connection \n"
out = ''
while out != 'q':
out = str(raw_input('->'))
recv = s.recv(1024)
s.send(name + ": " + out)
time.sleep(0.1)
print recv
s.close()
if __name__ == '__main__':
main()
感谢您的帮助 :) (请原谅我的混乱:/)
【问题讨论】:
-
您的客户大部分时间都花在
raw_input()上,不可能收到任何东西。如果您在单独的线程中进行输入/发送和接收,事情会起作用 - 但如果在用户键入时收到消息,结果将是屏幕上的混乱。您确实需要一个 GUI,或者像curses这样的文本界面,以便用户输入和传入消息位于屏幕的不同区域,不会相互干扰。 -
好吧,你告诉我的是我应该等待其他客户的回复?
-
@LiorDahan 不,他是说你应该使用一个可以在显示输出的同时处理输入的界面。诅咒或gui。或者您可以在数据可用时一次读取一个字符
sys.stdin,打印收到的数据并重新打印当前用户输入状态。但实际上,如果您使用的是 linux,请使用 curses。如果您在 Windows 上,只需选择 tkinter/wxPython/qt/gtk+ 或 your poison 的任何其他框架。或者只是使用线程并暂时使用打乱的输入/输出。
标签: python sockets networking