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

时间:2018-01-25 08:21:49

标签: python sockets

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

2 个答案:

答案 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)并尝试发送/接收某些内容(如果我发现错误/空字符串然后重新启动过程)。

参考:https://docs.python.org/2/library/socket.html