python - python多客户端聊天不起作用
问题描述
当我运行 main 和客户端的 py 文件时未显示错误但未显示用于发送消息的输入。怎么修?
main.py 结果--> Waiting... 并连接 192.168.1.26 58767
clients.py 结果--> 没有
这是 main.py
import threading
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host="192.168.1.26"
port=1111
threadcount=0
server.bind((host,port))
print("Waiting...")
server.listen(3)
def clients(connection):
connection.send(str.encode("welcome\n"))
while True:
data=connection.recv(2048)
reply="server says" + data.decode("utf-8")
if not data:
break
connection.sendall(str.encode(reply))
connection.close()
while True:
client,adress=server.accept()
print("connected"+ str(adress[0]) + " " + str(adress[1]))
threading.Thread(target=clients,args=(client,))
threadcount+=1
server.close()
这是clients.py
import socket
client_socket=socket.socket()
host="192.168.1.26"
port=1111
client_socket.connect((host,port))
response=client_socket.recv(1024)
print("hello")
while True:
input=input("say")
client_socket.send(str.encode(input))
Response=client_socket.recv(1024)
print(Response.decode("utf-8"))
client_socket.close()
解决方案
看起来您的线程从未真正开始。一种解决方案是定义一个在run
例程中实现线程逻辑的类。该类应该继承threading.Thread
. 然后,您可以简单地将类初始化为对象并调用其start
例程。尝试以下原始服务器代码的变体。
import threading
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host="192.168.1.26"
port=1111
threadcount=0
server.bind((host,port))
print("Waiting...")
server.listen(3)
class ServerThread(threading.Thread):
def __init__(self, threadsocket):
threading.Thread.__init__(self)
self.threadsocket = threadsocket
def run(self):
self.threadsocket.send(str.encode("welcome\n"))
while True:
data=self.threadsocket.recv(2048)
reply="server says" + data.decode("utf-8")
print(reply)
if not data:
break
self.threadsocket.sendall(str.encode(reply))
self.threadsocket.close()
while True:
client,adress=server.accept()
print("connected"+ str(adress[0]) + " " + str(adress[1]))
thread = ServerThread(client)
thread.start()
threadcount+=1
server.close()
至于客户端,正如我在评论中提到的,您不应将input
其用作变量名来存储input
函数的结果。将其更改为类似的东西data
。
推荐阅读
- python-3.x - 如何在Python中禁用放置在QTableWidget中的Qcombobox的鼠标滚轮事件?
- angular - 如何将缓冲的 Observable 流拆分为 3 个 Observable 并在 3 个 Observable 之间移动项目?
- css - CSS在边缘添加带有内容的换行符
- html - 通过子节点 XSLT 的后代进行模板循环
- c# - XSD File Build Action
- javascript - VueJS:将随机数从后端转换为印度编号系统
- python - Python segfault计算负指数(ppc64le)
- mysql - 在 Mac 终端中使用 mysql 的权限被拒绝
- python - Kivy Apk Buildozer:ReferenceError:弱引用对象不再存在
- javascript - golang net/http 在尝试调用不是 / 的其他路由时给出 404 错误