我是新来的插座,我想做一个小程序,从服务器获得时间。代码如下:
服务器:
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”时,我得到了时间,并再次请求任务。但再也不能从服务器上获得时间。客户端不将任务发送到服务器。但为什么呢?你知道吗
另外,如果代码中有错别字,我很抱歉。我想给你看看程序逻辑。密码在有坏掉的wi-fi的笔记本电脑上。所以我不得不在另一台笔记本电脑上再次输入代码。你知道吗
在服务器端,必须以连贯的方式使用.listen()和.accept()。 当您在.listen()中指定一个参数时,您正在创建一个队列,在该队列中可以一次接受不同的连接(当然是使用.accept())。你知道吗
因此,如果您只想使用一个永久连接,.accept()必须在While True之前写入;否则您必须认识到上一个套接字已经关闭:我使用.setblocking(False)并尝试发送/接收某些内容(如果捕获到错误/空字符串,则重新启动过程)。你知道吗
引用:https://docs.python.org/2/library/socket.html
您的代码的
elif
部分已修复这里的问题
处理完第一个命令后,再次转到
accept
连接,但是您的客户机正在使用现有的连接。服务器坏了。你知道吗你需要第二个内环:
获取
off
命令后关闭连接时从中break
退出的循环。你知道吗爆发之后,你又适合
accept
相关问题 更多 >
编程相关推荐