客户仅在以下情况将数据发送给服务器

2024-04-27 03:10:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的插座,我想做一个小程序,从服务器获得时间。代码如下:

服务器:

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的笔记本电脑上。所以我不得不在另一台笔记本电脑上再次输入代码。你知道吗


Tags: 代码import服务器hosttaskiftimeport
2条回答

在服务器端,必须以连贯的方式使用.listen()和.accept()。 当您在.listen()中指定一个参数时,您正在创建一个队列,在该队列中可以一次接受不同的连接(当然是使用.accept())。你知道吗

因此,如果您只想使用一个永久连接,.accept()必须在While True之前写入;否则您必须认识到上一个套接字已经关闭:我使用.setblocking(False)并尝试发送/接收某些内容(如果捕获到错误/空字符串,则重新启动过程)。你知道吗

引用:https://docs.python.org/2/library/socket.html

您的代码的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

获取off命令后关闭连接时从中break退出的循环。你知道吗

爆发之后,你又适合accept

相关问题 更多 >