Python Socket服务器在后台检查连接

时间:2016-11-27 18:57:26

标签: python sockets

我正在使用在我的iPhone上运行的应用程序的Wi-Fi恒温器。它使用套接字使用内置套接字库与python程序进行通信。我遇到的问题是,我希望能够在手机未连接时改变温度但服务器将搜索1秒然后超时(iPhone连接的最短时间)这不是让我可以通过旋转编码器平稳地调节温度。有没有办法在后台蓄水池?

import sys
import socket
import os
import time
temp = 15
while True:
    try:
        HOST = '192.168.1.22'
        PORT = 10000
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        s.listen(1)
        s.settimeout(1)
        conn, addr = s.accept()
        #conn.send(str(9).encode())
        conn.send(str(temp).encode())
        while True:
            data = conn.recv(1024)
            if not data: break
            print(data)
            print(data.decode())
            data2 = data.decode()
            if int(data2) in range(5, 31):
                print(data2)
                print("Setting the temperature to " + str(data2) + "°")
                conn.send(("Setting the temperature to " + str(data2)).encode())
                temp = data2
            else:
                print("Not in range")
                conn.send("Not in range!\n".encode())
    except:
        print("No Connection!")

谢谢!

1 个答案:

答案 0 :(得分:0)

你的术语有点令人困惑,但我想我知道你要做的是什么。当你的程序以1秒的超时执行accept时,那不是“搜索” - 它只是在等待客户端。

听起来你应该将你的代码分成三部分:

  1. 实际调整温度计
  2. 侦听来自iPhone客户端(TCP侦听器)的连接
  3. 等待(“侦听”)来自旋转编码器的调整。
  4. 我会将每个放在一个单独的线程中(使用python threading模块)。创建FIFO队列(使用queue模块)。让第一个(恒温器 - 调节器)线程等待队列(Queue.get),让另外两个接受指令(分别来自TCP和旋转编码器)并通过队列(Queue.put)提供命令

    然后你可以摆脱TCP侦听器中的超时,并让它无限期地阻塞accept。同样,您的旋转编码器监听器可以简单地等待调整。并且恒温器调节器线程可以阻止等待来自队列的指令。这使得所有三个更容易编程,理解和排除故障。