python-3.x - 为什么这个 Python3 聊天在几条消息后失败?
问题描述
这就是发生的事情:客户端发送一些消息后,它给出 ConnectionAbortedError: [WinError 10053] 并且服务器继续运行
图片:
这是我的服务器代码:
from socket import *
def server(address, port):
sock = socket(AF_INET, SOCK_STREAM)
sock.bind((address, port))
sock.listen(10)
while True:
clientsock, addr = sock.accept()
ip, _ = addr
msg = input('YOU: ')
clientsock.send(bytes(msg, 'utf-8'))
data = clientsock.recv(2048)
print('%s - ' % ip, data.decode('utf-8'))
if not data:
break
clientsock.shutdown(SHUT_WR)
clientsock.close()
sock.close()
if __name__ == '__main__':
server('192.168.0.101', 5000)
客户:
from socket import *
def client(address, port):
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((address, port)) #0.0.0.0 isnt valid
while True:
data = sock.recv(2048)
print('%s - ' % address, data.decode('utf-8'))
msg = input('YOU: ')
sock.send(bytes(msg, 'utf-8'))
sock.close()
if __name__ == '__main__':
client('192.168.0.101', 5000)
解决方案
每个循环中的服务器接受新客户端发送一条消息接收一条消息并断开客户端。然后它等待另一个客户。
您需要另一个循环来处理客户端。
另一个循环可以放在另一个线程中。
如果您将该循环嵌套在此循环中,则您一次只能处理一个客户端。我这样修改了您的服务器:
def server(address, port):
sock = socket(AF_INET, SOCK_STREAM)
sock.bind((address, port))
sock.listen(10)
while True: # server loop
clientsock, addr = sock.accept()
ip, _ = addr
msg = "Hello to client from %s" % ip
# next line is here because your client need message from server to send message
clientsock.send(bytes(msg, 'utf-8'))
while True: # client loop
data = clientsock.recv(2048)
msg = '%s - %s' % (ip, data.decode('utf-8'))
print(msg)
if not data:
break
clientsock.send(bytes(msg, 'utf-8')) # for multiple clients you need send msg to all
clientsock.shutdown(SHUT_WR)
clientsock.close()
sock.close()
要处理多个客户端,您不希望在客户端循环结束之前阻塞服务器循环。您可以在另一个线程中运行客户端循环并继续等待下一个客户端clientsock, addr = sock.accept()
。
同样,您可能希望将接收消息与服务器分开并等待客户端输入。
推荐阅读
- r - 将日期时间向量与数值向量绑定时如何保持定义的日期时间格式?
- java - 如何将此 XML SOAP 响应解析为 POJO?
- qbasic - 使用 QBasic 计算阶乘
- r - 在 for 循环中保存 CSV 文件
- pyspark - 与谓词下推相关的数据块分区
- python - 安装 python-telegram-bot 时出现错误“找不到包 'libffi'”
- apache - 需要从 .htaccess mod-rewrite 重定向规则中删除特定文件夹
- amcharts - 将 baseInterval 设置为月份的 Amchart 错误
- heroku - 从 Heroku Scheduler 调用 rake 任务
- javascript - 如何根据位置将 Google Map API 标记链接到 Flickr API 照片搜索