简体   繁体   English

Python套接字脚本<-> HTML客户端

[英]Python Socket script <-> HTML client

Using the following code I can create a Socket Server in my Raspberry Pi which works great if accessed via Socket clients like Android apps. 使用以下代码,我可以在Raspberry Pi中创建一个Socket Server,如果通过Socket客户端(如Android应用程序)进行访问,则可以很好地工作。

However, I would like to integrate websocket functionality to my website so I started trying to send a simple message via HTML textbox that the python script will receive and answer back. 但是,我想将websocket功能集成到我的网站,所以我开始尝试通过HTML文本框发送一条简单的消息,python脚本将接收并回复该消息。

The problem is I cant get the HTML code to open, send and keep open the socket for communication . 问题是我无法打开,发送和保持打开套接字的HTML代码以进行通信 I do acknowledge the html client connecting to python but cant get data as it seems the connection closes. 我确实承认连接到python的html客户端,但由于连接似乎关闭而无法获取数据。

Python code Python代码

#!/usr/bin/env python

#python3
# https://pythonprogramming.net/client-server-python-sockets/

import socket               # Websocket 
import sys                  # 
from _thread import *       # Used for multi-threading      The thread module has been renamed to _thread in Python 3.
import time                 # Used to create delays

# ******* WEBSOCKET VARIABLES *******
numberClients = 0
host = ''
PORT = 2223
# ******* WEBSOCKET VARIABLES *******

# ************************** FUNCTIONS **************************
def threaded_client(conn,address):      # receive as parameters, the connection object (conn), and the address object that contains the ip and port
    global numberClients
    conn.send(str.encode('Welcome, type your info\n'))  # data should be bytes
    numberClients = numberClients + 1

    #           CHECK USER USING PASSWORD OR SOMETHING
    if ("192.168" in str(address[0])):
        print ("     VALID CLIENT!!")

        while True:
            data = conn.recv(2048)
            if (data):
                reply = "" + 'Server output: '+ data.decode('utf-8').rstrip() + "\n"
                print(str(address[0]) + " - Clients(" + str(numberClients) + ") -> Data received: >" + data.decode('utf-8').rstrip() + "<")
            if not data:
                #print("no data")
                #break
                foo = 2
            try:
                conn.sendall(str.encode(reply))     # data should be bytes
            except Exception as e:
                foo = 1
        print("Thread connection closed by client: " + address[0])
        conn.close()
        numberClients = numberClients - 1

    else:
        print ("     INVALID CLIENT -> Thread connection closed by USER VALIDATION: " + address[0])
        conn.close()
        numberClients = numberClients - 1
# ************************** FUNCTIONS **************************




# ************************** SETUP **************************
print ("\n----------- Starting Websocket Python Program -----------\n")

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   # "s" here is being returned a "socket descriptor" by socket.socket.
print(s)

# we are simply attempeting to bind a socket locally, on PORT 5555.
try:
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)         # reuse the port number (in case we just got an error and port was not freed)
    s.bind((host, PORT))                # server side - take IN connections
    print ("Server started on port " + str(PORT))
except socket.error as e:
    print(str(e))
    print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
    #sys.exit()
print('Socket bind complete')

s.listen(5)     # the "5" stands for how many incoming connections we're willing to queue before denying any more.

print('Waiting for a connection.')
# ************************** SETUP **************************



# ************************** MAIN LOOP **************************
while True:
    conn, addr = s.accept()         # code will stop here whilst waiting for a new connection. Old connections will be running in the threads
    print('Connected to: '+addr[0]+':'+str(addr[1]))

    start_new_thread(threaded_client,(conn,addr))   
# ************************** MAIN LOOP **************************

One of the many HTML codes I have tried: 我尝试过的许多HTML代码之一:

  <script type="text/javascript"> function WebSocketTest() { if ("WebSocket" in window) { alert("WebSocket is supported by your Browser!"); // Let us open a web socket var ws = new WebSocket("ws://192.168.1.20:5252/echo"); ws.onopen = function() { // Web Socket is connected, send data using send() ws.send("133:L1"); alert("Message is sent..."); }; ws.onmessage = function (evt) { var received_msg = evt.data; alert("Message is received..."); }; ws.onclose = function() { // websocket is closed. alert("Connection is closed..."); }; } else { // The browser doesn't support WebSocket alert("WebSocket NOT supported by your Browser!"); } } </script> </head> <body> <div id="sse"> <a href="javascript:WebSocketTest()">Run WebSocket</a> </div> </body> </html> 

As you can see things which are working: - More than one client can connect - Clients connecting from android app can send and receive messages and keep connection open - html client is accepted but no message is send 如您所见,所有工作正常:-多个客户端可以连接-从android应用程序连接的客户端可以发送和接收消息并保持连接打开-接受html客户端,但不发送消息

在此处输入图片说明

That's not a Websocket application you create with Python but a Socket application. 这不是您使用Python创建的Websocket应用程序,而是Socket应用程序。 Websocket is a protocol on top of HTTP which sits on top of TCP which are the actual sockets you've used in your Python application. Websocket是位于HTTP之上的协议,位于HTTP之上,而TCP则是您在Python应用程序中使用的实际套接字。 To create a Websockets server with python you might try the websockets library. 要使用python创建Websockets服务器,您可以尝试使用websockets库。

For more details about the difference see Difference between socket and websocket? 有关差异的更多详细信息,请参见套接字和websocket之间的差异 or Differences between TCP sockets and web sockets, one more time for the difference. TCP套接字和Web套接字之间的差异,又需要花费更多时间 For server code see https://stackoverflow.com/questions/5839054/websocket-server-in-python . 有关服务器代码,请参见https://stackoverflow.com/questions/5839054/websocket-server-in-python

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM