我已经在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 data != b'/dc': message = client[0] + ': ' + data.decode() + '\n' print(message) logs.write(message) else: conn.close() break
这期望客户端发送/dc
以退出循环。但是客户端永远不会发送,/dc
因为它将退出循环并在/dc
输入时关闭套接字,并且不会/dc
在套接字关闭之前发送:
if message != b'/dc': print('sending {!r}'.format(message)) sock.sendall(message) else: break
在客户端关闭的情况下,服务器将recv
清空字符串。空字符串!= b'/dc'
表示符合条件以打印消息,而不是关闭连接并退出循环
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句