当前位置: 首页 > 面试题库 >

将javascript客户端连接到python websocket服务器

于嘉誉
2023-03-14
问题内容

我有这个工作的python websocket服务器:

#!/usr/bin/env python
from socket import *

HOST = ''
PORT = 8080
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

def loop():
    while True:
        print 'Waiting for connection...'
        tcpCliSock, addr = tcpSerSock.accept()
        print '...connected from :', addr
        while True:
            data = tcpCliSock.recv(BUFSIZ)
            if not data:
                break
            else:
                print 'data: ',data
        tcpSerSock.close()

try:
    loop()
except KeyboardInterrupt:
    tcpSerSock.close()

当我从python客户端连接时,即使我关闭客户端,服务器也会崩溃:

Waiting for connection...
Traceback (most recent call last):
  File "ledServer.py", line 27, in <module>
    loop()
  File "ledServer.py", line 16, in loop
    tcpCliSock, addr = tcpSerSock.accept()
  File "/usr/lib/python2.7/socket.py", line 202, in accept
    sock, addr = self._sock.accept()
  File "/usr/lib/python2.7/socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor

无论如何,当我运行此javascript客户端时:

window.onload = function(){
    ws = new WebSocket('ws://192.168.25.7:8080'); 
    ws.onmessage = function(event){document.write("message received"); alert(event.data); ws.close();} 
    ws.onopen = function(){document.write("open");} 
    ws.onclose = function(){document.write("close");}
    ws.onerror = function(){document.write("error");}
}

我在服务器上得到这个:

...connected from : ('192.168.25.25', 53747)
data:  GET / HTTP/1.1
Host: 192.168.25.7:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,tr;q=0.6,nl;q=0.5
Sec-WebSocket-Key: pH4kNOzz1MYyi+oXmaFCcA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

但是即使服务器表示已连接,但在客户端上未执行onopen函数,Chrome表示websocket状态为“待处理”,如果我尝试向服务器发送消息,则会得到:

Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

我究竟做错了什么?


问题答案:

Pythonsocket模块与websockets无关。

WebSocket和HTTP一样,是在基础传输之上实现的协议。您的代码要做的是设置一个侦听端口8080的TCP服务器。Websockets位于HTTP之上,就像HTTP一样。您可以看到浏览器尝试与服务器握手,但由于服务器响应不正确而放弃了。

websocket协议有些复杂,您可能需要一个库来为您处理。一个示例是websockets模块:

#!/usr/bin/env python

import asyncio
import websockets

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)

asyncio.get_event_loop().run_until_complete(
    websockets.serve(echo, 'localhost', 8765))
asyncio.get_event_loop().run_forever()


 类似资料:
  • 我的connect调用的结果始终是10061:连接被拒绝。 如果我将服务器代码更改为绑定到::(或者将空主机传递给getaddrinfo()(同样的事情)),并将客户机代码更改为在getaddrinfo()调用中指定空主机,那么V4客户机可以很好地连接。 谁能解释一下为什么?我没有读到任何东西,如果我们想要双套接字行为,我们必须指定一个空主机(因此使用INADDR_ANY)。这不可能是一个要求,因

  • 我有一个示例Spring启动应用程序来运行图形QL服务器,具有作为客户端,我的pom有以下依赖项: 当我尝试从客户端连接时,出现以下错误: 狩猎决议好心建议。 我还有几个问题: 我应该使用SimpleGraphQLHttpServlet将请求路由到endpoint吗 我正在React UI上使用apollo client,那么它是强制使用apollo server还是spring boot可以工作

  • 下面是我的服务器代码: 下面是我的客户端活动代码: 以下是客户端活动的xml布局文件: 因此,我开始认为这不是连接端口的问题,而是应用程序的android客户端的问题。但我想不出有什么问题。 顺便说一下,当我试图发送消息时,运行客户端的手机和运行服务器的笔记本电脑都连接到了同一个网络。

  • 客户端应用程序在以下代码处挂起:

  • 所有的 我正在尝试连接到Oracle 19C数据库。我安装了两个Oracle客户端(11g和12c),因为我们需要支持遗留程序。我可以通过12c客户端与使用sqlplus的任何用户连接,没有问题。但是如果我与任何用户一起使用11g(11.2.0)客户端。我总是得到: 两个客户端都有完全相同的sqlnet。ora和tnsnames。ora文件,因此两个客户端都指向同一个数据库。 有什么想法吗?我是否

  • Java: 在C#中-它停止在“receiver=listener.accept();”在java(android)中-它停止于“sender_socket=new Socket(serverAddr,SERVERPORT);”这应该是java套接字函数的问题--需要另一个函数连接到C#-server。

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 我制作了一个FTP客户端(被动),它无法连接到服务器。我使用的FTP服务器是Filezilla;我只是用它来测试。每次我运行java程序(FTP客户端)时,Filezilla都会断开连接,并在Eclipse中出现以下错误: 这是FTP客户端: 这是我连接的程序: 还尝试编写我的lan ip而不是