python - 持续监听TCP端口

标签 python tcp

我编写了一个代码,可以通过 TCP 协议(protocol)从端口接收数据。我每 15 分钟从 ESP8266 接收一次数据,然后 ESP 进入深度 sleep 模式。如何更改它以使其连续工作?我想在 while 循环中创建一个新连接,但它不起作用。

我的代码

import sys
import socket

TCP_IP = '192.168.42.1'
TCP_PORT = 8888
BUFFER_SIZE = 1024
param = []
i=0

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

#print 'Listening for client...'

#conn, addr = s.accept()
#print 'Connection address:', addr
while 1:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((TCP_IP,TCP_PORT))
    s.listen(1)

    print 'Listening for client...'
    conn, addr = s.accept()
    print 'Connection address:', addr
    data = conn.recv(BUFFER_SIZE)
    if data == ";" :
            conn.close()
            print "Received all the data"
            i=0
            for x in param:
                    print x
            #break
    elif data:
            print "received data: ", data
            param.insert(i,data)
            i+=1
            #print "End of transmission"

编辑:

修改后的代码

import sys
import socket

TCP_IP = '192.168.42.1'
TCP_PORT = 8888
BUFFER_SIZE = 1024
param = []
i=0

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

#print 'Listening for client...'

#conn, addr = s.accept()
#print 'Connection address:', addr
while 1:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((TCP_IP,TCP_PORT))
    s.listen(1)
    while 1: 
            print 'Listening for client...'
            conn, addr = s.accept()
            print 'Connection address:', addr
            data = conn.recv(BUFFER_SIZE)
            if data == ";" :
                    conn.close()
                    print "Received all the data"
                    i=0
                    for x in param:
                            print x
                    #break
            elif data:
                    print "received data: ", data
                    param.insert(i,data)
                    i+=1
                    #print "End of transmission"
    s.close()

我创建了第二个 while 循环。我现在可以连续收听,但我只从 ESP 收到一个数据包(ESP 发送 9 个数据包)。如何解决这个问题?

最佳答案

如果你想持续监听来自远程端的连接和数据,你可以使用 select() 实现这一点

使用 select() 的代码的修改版本如下所示。这也将处理远程端关闭连接:

import sys
import socket
import select

TCP_IP = '127.0.0.1'
TCP_PORT = 8888
BUFFER_SIZE = 1024
param = []

print 'Listening for client...'
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((TCP_IP,TCP_PORT))
server.listen(1)
rxset = [server]
txset = []

while 1:
    rxfds, txfds, exfds = select.select(rxset, txset, rxset)
    for sock in rxfds:
        if sock is server:
            conn, addr = server.accept()
            conn.setblocking(0)
            rxset.append(conn)
            print 'Connection from address:', addr
        else:
            try:
                data = sock.recv(BUFFER_SIZE)
                if data == ";" :
                    print "Received all the data"
                    for x in param:
                        print x
                    param = []
                    rxset.remove(sock)
                    sock.close()
                else:
                    print "received data: ", data
                    param.append(data)
            except:
                print "Connection closed by remote end"
                param = []
                rxset.remove(sock)
                sock.close()

注意,我已经用环回替换了您的 IP 地址,但您明白了。

希望这对您有所帮助。

关于python - 持续监听TCP端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47304657/

相关文章:

python - 您如何形成数据以在 scikit 学习决策树中制作一个包含 n 个特征和 n 个样本的数组?

python - 使用 Python 的文件监视器中出现 ValueError ("empty pattern")

ssl - 去TLS连接

Python,建立独占的TCP连接

c# - 多线程 TCP 服务器回显给所有客户端

python - 按多个字段对目录结果进行排序

python - 使用 ctypes windll 卸载 64 位 dll 时出错

C Socket 客户端打印出奇怪的输出

sockets - 使用 TcpStream 强制非阻塞读取

Python 多个条件与 numpy.where