python - 客户端只向服务器发送一次数据

标签 python sockets

我是套接字的新手,我想编写一个小程序从服务器获取时间。这是代码:

服务器:

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()

我第一次向服务器发送“”时,我得到了时间,然后再次请求任务。但永远不会再从服务器获取时间。客户端不会将任务发送到服务器。但是为什么?

附言抱歉,如果代码中有拼写错误。我想向您展示程序逻辑。该代码位于 Wi-Fi 损坏的笔记本电脑上。所以我不得不在我的另一台笔记本电脑上再次输入代码。

最佳答案

修复了 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()

在处理完您的第一个命令后,您再次接受 连接,但是您的客户端正在使用现有 连接。服务器不见了。

你需要第二个内循环:

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 命令后关闭连接时,您从中中断的循环。

爆发后你又适合accept

关于python - 客户端只向服务器发送一次数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438463/

相关文章:

python - 用于降维的 Scikit-learn 主成分分析 (PCA)

python - 为什么这个 tensorflow 代码会崩溃?

python - 由于文件并不真正存在,因此将更改推送到 GitHub 时出现问题

sockets - 使用 boost::asio::read_some 在 TCP/IP 中丢弃数据?

c - 用于纯 L2 数据包的 sendmsg 或 sendmmsg

python - 如何反转 matplotlib pyplot pcolor cmap

python - 是否有 Pytz 时区列表?

node.js - 如何关闭 socket.io 连接

sockets - 一个套接字上有多个UDP数据包

java - 使用套接字的聊天应用程序无法在 Java 中通过 Internet 工作