Python套接字服务器:处理输入

时间:2017-02-01 14:22:43

标签: python sockets socketserver

我希望通过一个无法发送RESTful消息的软件来控制Phillips色调灯,这样我就会尝试编写一些可以解释TCP消息的中间件传递对灯泡的适当要求。套接字服务器来自我在BinaryTides上找到的一个例子。

我使用qhue来处理Phillips的所有事情,但我的问题是使用python解释消息。当我启动套接字服务器并使用netcat从另一台笔记本电脑连接到它时,我似乎无法激活任何所需的颜色更改。

键入红色或绿色会导致发送qhue消息,但我总是以" UNKOWN COMMAND"结果

# Socket server in python using select function

import socket, select, requests
from qhue import Bridge

if __name__ == "__main__":

CONNECTION_LIST = []    # list of socket clients
RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2
PORT = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# this has no effect, why ?
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("0.0.0.0", PORT))
server_socket.listen(10)

# Add server socket to the list of readable connections
CONNECTION_LIST.append(server_socket)

# qhue setup
hueBridge = "172.16.17.73"
hueUsername = "hLaqm-dJZKabcdeTz1QwyMHqiLnzlFl3KKKM2x4o"
b = Bridge(hueBridge, hueUsername)
green = 25500
red = 0

print "Chat server started on port " + str(PORT)

while 1:
    # Get the list sockets which are ready to be read through select
    read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[])

    for sock in read_sockets:

        #New connection
        if sock == server_socket:
            # Handle the case in which there is a new connection recieved through server_socket
            sockfd, addr = server_socket.accept()
            CONNECTION_LIST.append(sockfd)
            print "Client (%s, %s) connected" % addr

        #Some incoming message from a client
        else:
            # Data recieved from client, process it
            try:
                #In Windows, sometimes when a TCP program closes abruptly,
                # a "Connection reset by peer" exception will be thrown
                data = sock.recv(RECV_BUFFER)
                # echo back the client message
                if data:
                    sock.send('OK ... ' + data)
                    print data
                    if str(data) is "Red" :
                        b.lights[1].state(bri=254, hue=Red)
                    elif str(data) is "Green" :
                        b.lights[1].state(bri=254, hue=green)
                    else:
                        print "UNKNOWN COMMAND"



            # client disconnected, so remove from socket list
            except:
                broadcast_data(sock, "Client (%s, %s) is offline" % addr)
                print "Client (%s, %s) is offline" % addr
                sock.close()
                CONNECTION_LIST.remove(sock)
                continue

server_socket.close()

更新:

我编写了一个简单的脚本,基于raw_input根据需要执行相同的操作。所以看起来问题在于套接字服务器读取和存储数据的方式。 (以下脚本有效)

from qhue import Bridge

# qhue setup
hueBridge = "172.16.17.73"
hueUsername = "hLaqm-dJZKwMwO9Tz1QwyMHqiLnzlFl3KKKM2x4o"
b = Bridge(hueBridge, hueUsername)
green = 25653
red = 65527

while 1:

Colour = raw_input("Pick a Colour > ")

if str(Colour) == "Red":
    b.lights[2].state(bri=254, hue=red)
elif str(Colour) == "Green":
    b.lights[2].state(bri=254, hue=green)
else:
    print "Unkown Colour"

0 个答案:

没有答案