Coder Social home page Coder Social logo

dwebsocket's Introduction

Hi there!!!

My name is Duan Hongyi. I am an open source enthusiast. Recently, I am working with to maintain a container cloud platform; If you are also interested, you can join us.

CTO,System architect and an ordinary programmer of Beijing Zhumengyuan Technology Co., Ltd. The initiator and author of many open source projects such as genius Chinese word segmentation, Python gmssl, dwebsocket, drycc, etc;

Believe in the Internet, advocate agility, and be willing to open source and share; Love technology, and more love life, love reading, like all simple things.

dwebsocket's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dwebsocket's Issues

使用localhost可以访问,但是换成ip就不能访问

描述:

dwebsocket已经集成好了,在浏览器端发送 ws://localhost:8080/echo_once 可以得到响应,但是换成
ws://172.28.8.97.:8080/echo_once 172.28.8.97是我本机ip,却无法连接,错误信息:

VM9305:1 WebSocket connection to 'ws://172.28.8.97:8080/echo_once/' failed: Connection closed before receiving a handshake response

code

  • views
@require_websocket
def echo_once(req):
    message = req.websocket.wait()
    req.websocket.send(message)
  • urls
    url(r'^echo_once', views.echo_once)
  • 服务启动命令

python manage.py runserver 0.0.0.0:8080

dwebsocket如何设置默认无消息断开时间,如何在apache上部署项目使websocket生效?

我在django项目下使用了dwebsocket,按照example使用accept_websocket写了个接收websocket的方法。使用django的默认启动方法启动项目,python manage.py runserver,
但是网页如果没有发送消息就差不多每隔30s会断开websocket连接,后台报错:

[29/Oct/2015 17:37:27]"GET /websocketserver HTTP/1.1" 500 59

Exception happened during processing of request from ('10.245.138.204', 65063)
Traceback (most recent call last):
File "C:\Python27\lib\SocketServer.py", line 599, in process_request_thread
self.finish_request(request, client_address)
File "C:\Python27\lib\SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 102
, in init
super(WSGIRequestHandler, self).init(_args, *_kwargs)
File "C:\Python27\lib\SocketServer.py", line 657, in init
self.finish()
File "C:\Python27\lib\SocketServer.py", line 716, in finish
self.wfile.close()
File "C:\Python27\lib\socket.py", line 283, in close
self.flush()
File "C:\Python27\lib\socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])

error: [Errno 10038]

请问下这个断开的时间是在哪里可以设置吗?
还有,我想将该django项目使用apache部署到服务器,但是无论如何都无法连接上websocket,还是只能在服务器上使用runserver才能连接上,请问下如何将该项目部署到apache呢,谢谢。

error: [Errno 9] Bad file descriptor

django version 1.6 python version 2.6.6
I have do this

  1. setting.py add 'dwebsocket.middleware.WebSocketMiddleware',
  2. function
    from dwebsocket import accept_websocket
    @accept_websocket
    def echo_once(request):
    if not request.is_websocket():
    message = 'hello'
    return HttpResponse(message)
    else:
    message = 'Hello world'
    request.websocket.send(message)
  3. url.py add

I use console to connect this websocket

socket = var WebSocket("ws://192.168.40.140/echo_once/")
console log error:
WebSocket connection to 'ws://192.168.40.140/echo_once/' failed: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0

Server error log:
Exception happened during processing of request from ('192.168.40.1', 58528)
Traceback (most recent call last):
File "/usr/lib64/python2.6/SocketServer.py", line 570, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib64/python2.6/SocketServer.py", line 332, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 126, in init
super(WSGIRequestHandler, self).init(_args, *_kwargs)
File "/usr/lib64/python2.6/SocketServer.py", line 628, in init
self.finish()
File "/usr/lib64/python2.6/SocketServer.py", line 671, in finish
self.wfile.flush()
File "/usr/lib64/python2.6/socket.py", line 303, in flush
self._sock.sendall(buffer(data, write_offset, buffer_size))
error: [Errno 9] Bad file descriptor

64位win7,py3.5,django1.10.4报错!

64位win7,py3.5,django1.10.4报错!

Traceback (most recent call last):
File "D:\xxx\lib\site-packages\django\core\handlers\exception.py", line
39, in inner
response = get_response(request)
File "D:\xxx\lib\site-packages\django\core\handlers\base.py", line 187,
in _get_response
response = self.process_exception_by_middleware(e, request)
File "D:\xxx\lib\site-packages\django\core\handlers\base.py", line 185,
in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\xxx\lib\site-packages\django\utils\decorators.py", line 149, i
n _wrapped_view
response = view_func(request, *args, **kwargs)
File "D:\xxx\lib\site-packages\dwebsocket\decorators.py", line 16, in n
ew_func
response = func(request, *args, **kwargs)
File "D:\xxx\ems\eim\views.py", line 1157, in realtimesalesdata
request.websocket.send(json.dumps(message)) #.encode().decode('unicode-escap
e')) #,ensure_ascii=False))
File "D:\xxx\lib\site-packages\dwebsocket\backends\default\websocket.py
", line 41, in send
self.protocol.write(message)
File "D:\xxx\lib\site-packages\dwebsocket\backends\default\protocols.py
", line 236, in write
self._write_frame(True, opcode, message)
File "D:\xxx\lib\site-packages\dwebsocket\backends\default\protocols.py
", line 224, in _write_frame
frame += data
TypeError: can't concat bytes to str

Traceback (most recent call last):
File "d:\python35\Lib\wsgiref\handlers.py", line 141, in run
self.handle_error()
File "D:\ems-d110p3\lib\site-packages\django\core\servers\basehttp.py", line 9
5, in handle_error
super(ServerHandler, self).handle_error()
File "d:\python35\Lib\wsgiref\handlers.py", line 368, in handle_error
self.finish_response()
File "d:\python35\Lib\wsgiref\handlers.py", line 180, in finish_response
self.write(data)
File "d:\python35\Lib\wsgiref\handlers.py", line 274, in write
self.send_headers()
File "d:\python35\Lib\wsgiref\handlers.py", line 331, in send_headers
if not self.origin_server or self.client_is_modern():
File "d:\python35\Lib\wsgiref\handlers.py", line 344, in client_is_modern
return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "d:\python35\Lib\socketserver.py", line 625, in process_request_thread
self.finish_request(request, client_address)
File "d:\python35\Lib\socketserver.py", line 354, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "d:\python35\Lib\socketserver.py", line 681, in init
self.handle()
File "D:\ems-d110p3\lib\site-packages\django\core\servers\basehttp.py", line 1
74, in handle
handler.run(self.server.get_app())
File "d:\python35\Lib\wsgiref\handlers.py", line 144, in run
self.close()
File "d:\python35\Lib\wsgiref\simple_server.py", line 36, in close
self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'

failed: Error during WebSocket handshake: Unexpected response code: 400
求助解决办法,谢谢!

使用 uwgsi 时,close websocket 时报错:uwsgi_response_write_headers_do(): Bad file descriptor [core/writer.c line 238] during GET /echo (127.0.0.1) IOError: write error

您好,
1、使用 uwgsi 时,close websocket 时报错
uwsgi_response_write_headers_do(): Bad file descriptor [core/writer.c line 238] during GET /echo (127.0.0.1) IOError: write error 。
2、如果运行 run_eventlet.py,close websocket 时,能正常关闭。
3、运行 python manage.py runserver , close websocket 时,报错
`
[14/May/2016 07:45:55] "GET / HTTP/1.1" 200 1466
[14/May/2016 07:46:03] "GET /echo HTTP/1.1" 200 0
Traceback (most recent call last):
File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run
self.finish_response()
File "/usr/lib/python2.7/wsgiref/handlers.py", line 128, in finish_response
self.write(data)
File "/usr/lib/python2.7/wsgiref/handlers.py", line 212, in write
self.send_headers()
File "/usr/lib/python2.7/wsgiref/handlers.py", line 270, in send_headers
self.send_preamble()
File "/usr/lib/python2.7/wsgiref/handlers.py", line 191, in send_preamble
self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
File "/usr/lib/python2.7/wsgiref/handlers.py", line 391, in _write
self.stdout.write(data)
File "/usr/lib/python2.7/socket.py", line 324, in write
self.flush()
File "/usr/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor

[14/May/2016 07:46:03] "GET /echo HTTP/1.1" 500 59

Exception happened during processing of request from ('127.0.0.1', 33492)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 99, in init
super(WSGIRequestHandler, self).init(_args, *_kwargs)
File "/usr/lib/python2.7/SocketServer.py", line 651, in init
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 710, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 279, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor
----------------------------------------`

其中 所有浏览器 1 和 3都报错。

uwgsi install后的输出:
`################# uWSGI configuration #################

pcre = True
kernel = Linux
malloc = libc
execinfo = False
ifaddrs = True
ssl = True
zlib = True
locking = pthread_mutex
plugin_dir = .
timer = timerfd
yaml = embedded
json = False
filemonitor = inotify
routing = True
debug = False
ucontext = True
capabilities = False
xml = expat
event = epoll

############## end of uWSGI configuration #############
total build time: 20 seconds
*** uWSGI is ready, launch it with /usr/local/bin/uwsgi ***`

版本:python2.7 + django1.9.5 +uwgsi2.0.13.1
我安装低版本的uwgsi,结果是一样的。

请问如何查询Django当前使用的后端?我使用Django1.9开发的工程,中途使用pip安装的dwebsocket0.4.2,出现了以下trace

我看到README里面提到,dwebsocket默认支持Django的开发环境:
Django develop server, eventlent, gevent, gunicore are supported by default.

我是用Django1.9开发的工程,用到一半需要使用websocket,然后就来到了这里,使用pip安装的dwebsocket,然后在代码里使用websocket,但是发现只要客户端一发起websocket连接请求,服务端出现以下trace:
abc

我看到issue里面提到了很多这种trace,作者都是问是否使用了gevent之类的,当前使用的backend是什么如何查询?我是用python manage.py runserver 0.0.0.0:8080启动的服务器,应该是develop server,这个不是默认就支持的吗?

备注:服务端的操作系统是debian linux

菜鸟求解答,谢谢

run with uwsgi report error

I use uwsgi to run my web,
add WEBSOCKET_FACTORY_CLASS = 'dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory' to settings.py

when I run , I have a error

File "/Users/admin/.virtualenvs/env_jd1.8.3/lib/python2.7/site-packages/dwebsocket/backends/uwsgi/factory.py", line 1, in
import uwsgi
ImportError: No module named uwsgi

请问作者,dwebsocket服务端发送的最大字符长度是多少?该如何修改!

我现在做是在Django上实现网页端和服务端实时视频传输。目前是网页端获取摄像头数据发送给服务端,服务端直接返回。
当使用github上的websocket模块写一个简单脚本作为服务端时没有问题,部署在django上,用您的dwebsocket模块时就会报错。网页端报错为:WebSocket connection to 'ws://sharoid.ru:8000/' failed: Could not decode a text frame as UTF-8。经过多次测试,发现当发送字符大于2^17时,就会出现错误。

你好,请问一下ValueError: Unknown opcode 10(fin:1, data:b'')是什么原因导致的呢

Traceback (most recent call last):
File "C:\Users\test\PLAI_GUI_0.1.6\PLAI_GUI\plaiserver\views.py", line 25, in trainingWebsocketLink
for message in request.websocket:
File "C:\Users\test\PLAI_GUI_0.1.6\PLAI_GUI\dwebsocket\websocket.py", line 55, in iter
message = self.wait()
File "C:\Users\test\PLAI_GUI_0.1.6\PLAI_GUI\dwebsocket\backends\default\websocket.py", line 87, in wait
new_data = self.protocol.read()
File "C:\Users\test\PLAI_GUI_0.1.6\PLAI_GUI\dwebsocket\backends\default\protocols.py", line 51, in read
_, data = self.read_data()
File "C:\Users\test\PLAI_GUI_0.1.6\PLAI_GUI\dwebsocket\backends\default\protocols.py", line 113, in read_data
"Unknown opcode %s(fin:%s, data:%s)" % (opcode, fin, data)
ValueError: Unknown opcode 10(fin:1, data:b'')

ubuntu16上用nginx和uwsgi部署example应用,出现错误:Error during WebSocket handshake: Unexpected response code: 400

Hi,

有个问题求教,尝试用网上的各种办法一直没有解决,谢谢!

ubuntu16上用nginx和uwsgi部署example应用,建立websocket链接的时候一直出现错误:WebSocket connection to 'ws://192.168.64.67:9000/echo' failed: Error during WebSocket handshake: Unexpected response code: 400。 但直接在开发环境中运行是好的。

以下是我的nginx配置:
# the upstream component nginx needs to connect to
upstream wstest {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
#server 127.0.0.1:8001; # for a web port socket (we'll use this first)
server unix:////home/fanxh/practice/websockettest/wstest.sock;
}

# configuration of the server
server {
# the port your site will be served on
listen 9000;
# the domain name it will serve for
server_name 192.168.64.67; # substitute your machine's IP address or FQDN
charset utf-8;

\# max upload size
client_max_body_size 75M;   # adjust to taste


location /static {
    alias /home/fanxh/practice/websockettest/collected_static; # your Django project's static files - amend as required
}

# Finally, send all non-media requests to the Django server.
location / {
    #proxy_pass http://192.168.64.67:9000/echo;
    #proxy_pass http://localhost:9000;
    uwsgi_pass  wstest;
    include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade"; 
}

uwsgi的启动命令是:
uwsgi --socket /home/fanxh/practice/websockettest/wstest.sock --chdir /home/fanxh/practicwebsockettest --module websockettest.wsgi --chmod-socket=666

uwsgi支持问题

我现在已经用了uwsgi起了一个项目,想在该项目下增加即时通讯的功能,是需要在已有uwsgi的基础上,同时再起一个uwsgi吗?这样一个项目跑了两个uwsgi。望解答

websocket前端链接抛异常

dwebsocket前端起链接时直接抛异常
Traceback (most recent call last):
File "/usr/local/python27/lib/python2.7/SocketServer.py", line 595, in process_request_thread
self.finish_request(request, client_address)
File "/usr/local/python27/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/python27/lib/python2.7/site-packages/Django-1.8.12-py2.7.egg/django/core/servers/basehttp.py", line 102, in init
super(WSGIRequestHandler, self).init(_args, *_kwargs)
File "/usr/local/python27/lib/python2.7/SocketServer.py", line 653, in init
self.finish()
File "/usr/local/python27/lib/python2.7/SocketServer.py", line 712, in finish
self.wfile.close()
File "/usr/local/python27/lib/python2.7/socket.py", line 279, in close
self.flush()
File "/usr/local/python27/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor

客户端频繁向服务端发送大量小数据时发生数据截断

经验证,客户端频繁向服务端发送大量小数据是发生数据截断:
{"func":"search","args":["xls_202.py","金","1","0","1","t0"],"sid":"s1","cid":"c5771601425"}
{"func":"search","args":["xls_202.py","金","1","0","1","t1"],"sid":"s2","cid":"c5771601425"}
...
{"func":"search","args":["xls_202.py","金","1","0","1","t1298"],"sid":"s1297","cid":"c5771601425"}
{"func":"search","args":["xls_202.py","金","1","0","1","t1299"],"sid":"s1298","cid":"c5771601425"}
{"func":"search","args":["xls_202.py","金","1","0","1","t1300"],"sid":"s12
然后socket连接自动断开,报错:
error: [Errno 9] Bad file descriptor
奇怪的是,每次尝试都是在这里断开,但是前端发送数据确实是完整的,怀疑后端接受数据累积一定长度后就会在recv_buf中截数据出错,导致后续socket断开。

前端刷新重连,dwebsocket抛异常

我的情况是,前端首先发出一个ajax请求去异步响应一个事件。在ajax调用后,会发出web socket消息给后端,当界面刷新时,抛出如下异常,同时ajax响应也会因为这个得不到结果。

Traceback (most recent call last):
File "/home/q/python/lib/python2.7/wsgiref/handlers.py", line 86, in run
self.finish_response()
File "/home/q/python/lib/python2.7/wsgiref/handlers.py", line 128, in finish_response
self.write(data)
File "/home/q/python/lib/python2.7/wsgiref/handlers.py", line 212, in write
self.send_headers()
File "/home/q/python/lib/python2.7/wsgiref/handlers.py", line 270, in send_headers
self.send_preamble()
File "/home/q/python/lib/python2.7/wsgiref/handlers.py", line 191, in send_preamble
self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
File "/home/q/python/lib/python2.7/wsgiref/handlers.py", line 391, in _write
self.stdout.write(data)
File "/home/q/python/lib/python2.7/socket.py", line 324, in write
self.flush()
File "/home/q/python/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor

当有多个浏览器同时连接websocket后,怎么才能将消息反回给对应的浏览器?

@duanhongyi
请帮助解答一下我这个问题,谢谢您:
我的问题:
首先,我的需求是我的django部署之后,会有不同的人通过浏览器访问,前端的消息处理都是通过websocket进行的。
因为我后端有一个mqtt服务,当mqtt返回消息后需要给对应的浏览器发送消息,所以我怎么用对应的request.websocket 发送给对应的浏览器消息呢?或者有什么其它方法呢?

谢谢!

python 3.6,+Django 2.1.2+dwebsocket 0.5.4 前端只要一连接时就提示:ValueError: timeout must be non-negative

前端js代码如下:

$(function () {
        $('#connect_websocket').click(function () {
            if (window.s) {
                window.s.close()
            }
            /*创建socket连接*/
            var socket = new WebSocket("ws://" + window.location.host + "/echo");
            socket.onopen = function () {
                console.log('WebSocket open');//成功连接上Websocket
            };
            socket.onmessage = function (e) {
                console.log('message: ' + e.data);//打印出服务端返回过来的数据
                $('#messagecontainer').prepend('<p>' + e.data + '</p>');
            };
            // Call onopen directly if socket is already open
            if (socket.readyState === WebSocket.OPEN) socket.onopen();
            window.s = socket;
        });
        $('#send_message').click(function () {
            //如果未连接到websocket
            if (!window.s) {
                alert("websocket未连接.");
            } else {
                window.s.send($('#message').val());//通过websocket发送数据
            }
        });
        $('#close_websocket').click(function () {
            if (window.s) {
                window.s.close();//关闭websocket
                console.log('websocket已关闭');
            }
        });

    });

后端代码:

@accept_websocket
def echo(request):
    print(request.is_websocket())
    if not request.is_websocket():
        try:
            message = request.GET['message']
            return HttpResponse(message)
        except:
            return render(request, 'index.html')
    else:
        
        for message in request.websocket:
            print('llll',message)
            request.websocket.send(message)

错误信息:
Internal Server Error: /echo
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/dwebsocket/decorators.py", line 16, in new_func
response = func(request, *args, **kwargs)
File "/Users/xxxxx/PycharmProjects/xxxxx/xxxxx/views.py", line 29, in echo
for message in request.websocket:
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/dwebsocket/websocket.py", line 55, in iter
message = self.wait()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/dwebsocket/backends/default/websocket.py", line 89, in wait
if self.protocol.can_read(timeout=timeout):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/dwebsocket/backends/default/protocols.py", line 197, in can_read
r, w, e = select.select(r, w, e, timeout)
ValueError: timeout must be non-negative
[15/Oct/2018 17:23:07] "GET /echo HTTP/1.1" 500 86248

如果我在把wait()的默认值必为整数就不出现问题,但是一但timeout一样也会出现这个问题
def iter(self):

  '''
     Use ``WebSocket`` as iterator. Iteration only stops when the websocket
     gets closed by the client.
     '''
     while True:
         message = self.wait()
         yield message
         if message is None:
             break

请大神帮助解决一下!

怎么才能给等待信息添加超时判断

我想监听socket一段时间,如果没有收到消息就close。
粗略看了一下没有想到好的解决方法。对于python的理解不是很深刻,希望能讨论一下这个问题。

uwsgi部署 多个客户端同时请求数据服务端没反应

我使用dwebsocket做了个实时刷新日志的应用 但是开启客户端的个数受制于processes 开多少个进程才能开多少个web端 这.....

uwsgi --http :8091 --http-websockets --processes 1 --wsgi-file wsgi.py --async 30 --ugreen --http-timeout 300

EOFError: EOF when reading a line, websocket has been closed

这是我的配置文件,似乎dwebsocket还不支持uwsgi启动:

# settings/py
# dwebsocket 使用 uwsgi 服务器配置
WEBSOCKET_FACTORY_CLASS = 'dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory'

uwsgi 命令:

uwsgi --module project.wsgi:application --http 127.0.0.1:8080 --http-websocket

错误信息 :
File "/path-to-project/apps/cloud/views/terminal.py", line 48, in kubernetes_terminal
message = ws.wait()
File "/path-to-env/lib/python3.5/site-packages/dwebsocket/backends/default/websocket.py", line 92, in wait
opcode, data = self.protocol.read()
File "/path-to-env/lib/python3.5/site-packages/dwebsocket/backends/default/protocols.py", line 52, in read
return self.read_data()
File "/path-to-env/lib/python3.5/site-packages/dwebsocket/backends/default/protocols.py", line 117, in read_data
raise EOFError("EOF when reading a line, websocket has been closed")
EOFError: EOF when reading a line, websocket has been closed

python version 3.5.5
django version 1.11.2
dwebsocket version 0.5.10

当后端收到一个消息,前端怎么才能收到?

Hi @duanhongyi
我有一个这样的需求:
当我websocket连接成功后,我的后端会不定时收到一些数据,然后我怎样才能用request.websoket.sent(数据) 发给前端呢?
我了解的是的:

      for message in request.websocket:
           if not message:
               request.websocket.close()
           else:
               request.websocket.send(message)

上面这个代码,当我连接成功之后就一直在这个for里面了(只有前端触发后端才会收到),所以怎样在建立连接之后才能单独调用websoket.sen()去往前端传数据呢?
请帮助回答!

谢谢您!

当 socket 被关闭时,会报错 "error: [Errno 9] Bad file descriptor"

django 1.7.8
python manage.py runserver 0.0.0.0:8080

前端浏览器:

var ws = WebSocket('http://192.168.33.1/ws');
ws.send('test');
ws.close(); // 执行这里会报错

后端django:

Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run
    self.finish_response()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response
    self.write(data)
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 210, in write
    self.send_headers()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 268, in send_headers
    self.send_preamble()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 189, in send_preamble
    self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 389, in _write
    self.stdout.write(data)
  File "/usr/lib/python2.7/socket.py", line 324, in write
    self.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor
----------------------------------------
Exception happened during processing of request from ('192.168.33.1', 62509)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 582, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 129, in __init__
    super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "/usr/lib/python2.7/SocketServer.py", line 640, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 693, in finish
    self.wfile.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor
----------------------------------------

vim 命令 报编码错误

连接容器,执行vim命令报错

  File "/Users/zuili/.pyenv/versions/env_opsoa/lib/python3.5/site-packages/kubernetes/stream/ws_client.py", line 130, in peek_stderr
    return self.peek_channel(STDERR_CHANNEL, timeout=timeout)
  File "/Users/zuili/.pyenv/versions/env_opsoa/lib/python3.5/site-packages/kubernetes/stream/ws_client.py", line 78, in peek_channel
    self.update(timeout=timeout)
  File "/Users/zuili/.pyenv/versions/env_opsoa/lib/python3.5/site-packages/kubernetes/stream/ws_client.py", line 179, in update
    data = data.decode("utf-8")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 30: invalid start byte

ValueError: Unknown opcode 10(fin:1, data:b'')

你好 duanhongyi :
我 程序运行一会 ,不在输入数据,就会抛出如下的错误:

Internal Server Error: /echo
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py", line 149, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/dwebsocket-0.4.2-py3.6.egg/dwebsocket/decorators.py", line 16, in new_func
response = func(request, *args, **kwargs)
File "/home/zhourenquan/server/botServer_duolun/demo/views.py", line 236, in echo
message = request.websocket.wait()
File "/usr/local/lib/python3.6/site-packages/dwebsocket-0.4.2-py3.6.egg/dwebsocket/backends/default/websocket.py", line 87, in wait
new_data = self.protocol.read()
File "/usr/local/lib/python3.6/site-packages/dwebsocket-0.4.2-py3.6.egg/dwebsocket/backends/default/protocols.py", line 52, in read
_, data = self.read_data()
File "/usr/local/lib/python3.6/site-packages/dwebsocket-0.4.2-py3.6.egg/dwebsocket/backends/default/protocols.py", line 114, in read_data
"Unknown opcode %s(fin:%s, data:%s)" % (opcode, fin, data)
ValueError: Unknown opcode 10(fin:1, data:b'')

传输数据量过大,会造成 ws 关闭的问题。

环境:py2.7, dwebsocket v0.4.2(pypi版本), ubuntu 14.04(vagrant 虚拟机) ,分配 1G RAM)
启动方式: python manage.py runserver 0.0.0.0:8880

目前测试了下,超过特定长度的字符串发送,就会造成 websocket 的 onclose 。目前尝试过,发送 15w 长度的字符串,就会造成错误。

但是,存在一个奇特的现象。第一次发送例子里面的 hello world 字符串,再次发送 15w 长度的字符串,就没发生 onclose 错误了。

为避免错误,目前我的做法是,大于 5w 长度的字符串,就使用 post 进行发送。

希望能解决。

index.html 改造如下:

$(function () {
        var s = new WebSocket("ws://" + window.location.host + "/echo");
        s.onopen = function () {
            console.log('WebSocket open');
        };
        s.onmessage = function (e) {
            // console.log('message: ' + e.data);
            $('#messagecontainer').append('<p>' + e.data + '</p>');
        };
        s.onclose = function (e) {
            console.log('WebSocket close');
        }
        window.s = s;
        $('#send_message').click(function () {
            var send = $('#message').val();
            if(!window.s){
                alert("Please connect server.");
            }else{
                console.log(send.length);
                s.send(send);
            }
        });
    });
<textarea name="message" id="message" cols="30" rows="10">Hello, World!</textarea>

服务器端错误信息

[10/Sep/2015 21:43:32] "GET /echo HTTP/1.1" 500 466607
Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run
    self.finish_response()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 128, in finish_response
    self.write(data)
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 212, in write
    self.send_headers()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 270, in send_headers
    self.send_preamble()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 191, in send_preamble
    self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 391, in _write
    self.stdout.write(data)
  File "/usr/lib/python2.7/socket.py", line 324, in write
    self.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor
[10/Sep/2015 21:43:32] "GET /echo HTTP/1.1" 500 59
----------------------------------------
Exception happened during processing of request from ('192.168.102.1', 49920)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 129, in __init__
    super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "/usr/lib/python2.7/SocketServer.py", line 651, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 710, in finish
    self.wfile.close()
  File "/usr/lib/python2.7/socket.py", line 279, in close
    self.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 9] Bad file descriptor
----------------------------------------

打开页面后能正常发送和接收消息,但是我隔一会儿不使用就会抛错,请问有设置超时时间之类的属性吗

Traceback (most recent call last):
File "C:\Python27\lib\SocketServer.py", line 596, in process_request_thread
self.finish_request(request, client_address)
File "C:\Python27\lib\SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 99, in init
super(WSGIRequestHandler, self).init(*args, **kwargs)
File "C:\Python27\lib\SocketServer.py", line 654, in init
self.finish()
File "C:\Python27\lib\SocketServer.py", line 713, in finish
self.wfile.close()
File "C:\Python27\lib\socket.py", line 283, in close
self.flush()
File "C:\Python27\lib\socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10038]

使用uwsgi+django+gevent时报错:读取客户端数据时报错IOError: unable to fd 14 to the event queue

一旦调用wait()或者iter迭代器,就会出现以下报错:
请问以下是什么原因呢?
-------------------------------------------------------分割线----------------------------------
Tue Sep 18 16:31:05 2018 - ASYNC call without async mode !!!
Internal Server Error: /ws_connect
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py", line 149, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/decorators.py", line 16, in new_func
response = func(request, *args, **kwargs)
File "./OuterServer/Chat/service.py", line 199, in ws_connect
for message in request.websocket:
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/websocket.py", line 55, in iter
message = self.wait()
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/backends/default/websocket.py", line 87, in wait
new_data = self.protocol.read()
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/backends/default/protocols.py", line 52, in read
_, data = self.read_data()
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/backends/default/protocols.py", line 98, in read_data
fin, opcode, data = self.read_frame()
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/backends/default/protocols.py", line 123, in read_frame
header_bytes = self._read_strict(2)
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/backends/default/protocols.py", line 150, in _read_strict
_buffer = self.sock.recv(bufsize)
File "/usr/local/lib/python2.7/dist-packages/dwebsocket/backends/uwsgi/factory.py", line 18, in recv
uwsgi.wait_fd_read(self.fileno(), -1)
IOError: unable to fd 14 to the event queue

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.