我是socket的新手,我想制作一个小程序来从服务器上获取时间。这是代码:
服务器:
import socket
import time
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = 9999
serversocket.bind((host, port))
serversocket.listen(5)
while True:
clientsocket, addr = serversocket.accept()
task = clientsocket.recv(1024)
if not task:
break
if task.decode() == 't':
stime = time.strftime('%H:%M:%S', time.localtime())
clientsocket.send(('Server time: ' + stime).encode())
elif
task.decode() == 'off':
clientsocket.close()
else:
pass
serversocket.close()
客户端:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = 9999
sock.connect((host, port))
while True:
task = input('t to get time or off to disconnect')
sock.send(task.encode())
if task = 'off':
break
time = sock.recv(1024)
print(time.decode())
sock.close()
我第一次将't'发送到服务器时我得到了时间,我再次要求完成一项任务。但永远不要再次从服务器上获取时间。客户端不会将任务发送到服务器。但为什么呢?
P.S。对不起,如果代码中有拼写错误。我想向您展示程序逻辑。代码在笔记本电脑上,打破了Wi-Fi。所以我不得不在我的另一台笔记本电脑上再次输入代码。
答案 0 :(得分:1)
您的代码elif
部分已修复
import socket
import time
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = 9999
serversocket.bind((host, port))
serversocket.listen(5)
while True:
clientsocket, addr = serversocket.accept()
task = clientsocket.recv(1024)
if not task:
break
if task.decode() == 't':
stime = time.strftime('%H:%M:%S', time.localtime())
clientsocket.send(('Server time: ' + stime).encode())
elif task.decode() == 'off':
clientsocket.close()
else:
pass
serversocket.close()
问题在这里
while True:
clientsocket, addr = serversocket.accept()
处理完第一个命令后,再次转到accept
连接,但您的客户端正在使用现有连接。服务器已经消失了。
你需要第二个内循环:
while True:
task = clientsocket.recv(1024)
if not task:
break
if task.decode() == 't':
stime = time.strftime('%H:%M:%S', time.localtime())
clientsocket.send(('Server time: ' + stime).encode())
elif task.decode() == 'off':
clientsocket.close()
break
else:
pass
在获取break
命令后关闭连接时从off
出来的循环。
分手后你再次适合accept
答案 1 :(得分:0)
您必须以连贯的方式使用服务器端,.listen()和.accept()。 当您在.listen()中指定一个参数时,您正在创建一个队列,在该队列中可以同时接受不同的连接(当然使用.accept())。
因此,如果你只想使用一个永久连接,则必须在While True之前写入.accept();否则你必须认识到前一个套接字已经关闭:我使用.setblocking(False)并尝试发送/接收某些内容(如果我发现错误/空字符串然后重新启动过程)。