python - 尝试打破 Python 3 中的“接收”循环时,服务器套接字应用程序变成无限循环
问题描述
我在 Python 3 中创建了一个聊天服务器。它与客户端建立连接,等待来自客户端的消息,打印消息并将消息保存到 txt 文件。当客户端发送消息 b'/dc' 时,客户端关闭连接,服务器应该中断循环。相反,客户端正常关闭,但服务器循环无限地在屏幕上打印一条空消息。
服务器:
import socket
import sys
import os
import optparse
def createServer(port):
# create a TCP socket
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind the socket to the port
server_address = ('localhost', port)
print("starting up on {} port {}".format(*server_address))
sck.bind(server_address)
# put the socket into server mode
sck.listen(5)
return sck
def runServer(sck, conn, client, logs):
# server loop
while True:
data = conn.recv(1024)
if data != b'/dc':
message = client[0] + ': ' + data.decode() + '\n'
print(message)
logs.write(message)
else:
conn.close()
break
def main():
# option to set port when launching the server
parser = optparse.OptionParser("Usage: pyhon3 server.py -p <server port>")
parser.add_option('-p', dest='port', type='int', help="specify target port")
(options, args) = parser.parse_args()
port = options.port
if port == None:
print(parser.usage)
exit(0)
# create server logs
logs = open('./logs.txt', 'a+')
# create the socket
sck = createServer(port)
# wait for connection and start thread
conn, client = sck.accept()
runServer(sck, conn, client, logs)
if __name__ == '__main__':
main()
客户:
import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = ('localhost', 10000)
print('connecting to {} port {}'.format(*server_address))
sock.connect(server_address)
while True:
# Send data
message = bytes(input('> '), 'utf8')
if message != b'/dc':
print('sending {!r}'.format(message))
sock.sendall(message)
else:
break
sock.close()
客户端输出:
connecting to localhost port 10000
> test
sending b'test'
> 123
sending b'123'
> /dc
服务器输出:
127.0.0.1: test
127.0.0.1: 123
127.0.0.1:
127.0.0.1:
127.0.0.1:
127.0.0.1:
127.0.0.1:
...
解决方案
在您的服务器循环中,在 if 语句下,当它获得 b'/dc' 时打印消息,但您永远不会关闭连接。在 if 段的末尾应该有一个 conn.close() 语句。希望这可以帮助!祝你好运!
推荐阅读
- html - 即使将我的 html 文件重命名为 index.html,我也无法在 GitHub 页面上推送我的 repo,它只显示 README 文件。
- spartacus-storefront - 打开 SSR 时,登录用户的页面刷新导致白色闪烁
- rust - 急切加载关系
- javascript - 如何根据反应js中的输入隐藏表格行
- reactjs - 从 Next.js 项目中的任何地方访问 Socket.io
- haskell - Idris `foldl` 默认实现
- python - 如何使我的 numpy 数组按轴唯一?
- laravel-5 - 使用身份验证中间件时未定义路由 [x]
- ios - 推动 segue 过渡真的很不稳定 iOS App swift
- python - 如何创建输入形状 = 输出形状的自动编码器模型