在python中,如何在没有接收到套接字超时的任何数据后执行代码

2024-04-26 04:36:02 发布

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

我正在使用TCP套接字发送和接收数据。我的逻辑是,如果我的服务器接收到数据(例如0值),那么就可以正常结束。但是,如果我的服务器在设置套接字关闭超时10秒后没有收到任何数据,那么我希望我的值为默认值1。我正在尝试的服务器代码如下:

import socket
TCP_IP = "0.0.0.0"
TCP_PORT = 5004

BUFFER_SIZE = 20  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()

while 1:
    data = conn.recv(BUFFER_SIZE)
    if not data:
        break
        datalist = list(data)
        print("payload: %s" % datalist)
        conn.send(data)  # echo
    else:
        datalist = 1
        print("default value: %s" % datalist)

但10秒后,我得到超时错误,无法使默认数据列表值为1。 请告知。其目的是,如果它不接收任何数据,则将该值设置为1

错误:

Traceback (most recent call last):
  File "/home/code.py", line 15, in <module>
    conn, addr = s.accept()
  File "/usr/lib/python3.8/socket.py", line 292, in accept
    fd, addr = self._accept()
socket.timeout: timed out

Tags: 数据ip服务器datasizeportbuffer错误
2条回答

我认为您需要为客户端设置时间,因此如果它在十秒钟内发送消息,它应该保持连接,否则断开连接。情况就是这样:

以下是server.py代码:

import socket
TCP_IP = "127.0.0.1"
TCP_PORT = 5004
BUFFER_SIZE = 20  # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
conn.settimeout(10)
data = conn.recv(BUFFER_SIZE)
if data:
    conn.settimeout(None)
    conn.send(b"welcome")
    print("client is active")
    try:
        while True:
            data = conn.recv(BUFFER_SIZE)       
            if data:
                print("here is the message:",data)
            else:
                conn.close()
                break
    except Exception as e:
        print("error is",e)
else:
    print("client is inactive")

这是您的client.py代码:

import socket
TCP_IP = "127.0.0.1"
TCP_PORT = 5004
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
x = input("write anything if you want to connect >")
s.send(bytes(x,'utf-8'))
data = s.recv(1024)
print(data)
try:
    while True:
        x = input("write your message >")
        s.send(bytes(x,'utf-8'))
except Exception as e:
    print("error is",e)

若您为套接字设置超时,那个么您必须处理超时异常,在这种情况下,10秒后应该发生什么

while 1:
    try:
        data = conn.recv(BUFFER_SIZE)

        if data:
            #data recieved
            datalist = list(data)
            print("payload: %s" % datalist)
            conn.send(data)  # echo
            break

    except socket.timeout:
            #10 seconds finished
            datalist = 1
            print("default value: %s" % datalist)
            break
        

相关问题 更多 >