javascript HTML5 canvas显示从python websocket服务器 [英] javascript HTML5 canvas display from python websocket server

查看:189
本文介绍了javascript HTML5 canvas显示从python websocket服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个使用ZeroMQ4与中间件通信的websocket服务器。
我也创建了一个Javascript的peice来显示从中间件回来的信息。

I created a websocket server that uses ZeroMQ4 to talk to a middleware. I also created a peice of Javascript to display information back from the middleware.

我知道Websocket服务器工作,能够发送到javascript作为测试用小字符串输出。

I know the Websocket server works and is able to send to the javascript as i tested with small string output.

所以,我想从websocket服务器发送一个png图像到Javascript,但是canvas的Javascript文档是混乱的,我没有发现了一个坚实的例子,对于一个新手有Javascript。

So, I want to send an png image from the websocket server to Javascript, but the Javascript documentation of canvas is confusing and I haven't found a solid example good for a newbie with Javascript.

这是我迄今为止能够输入数据,但不显示任何图像的Javascript。 / p>

This is the Javascript I have so far it is able to input data in, but does not display any image.

var canvas = document.getElementById('stage');
var context = canvas.getContext("2d");

function openWS(){
    var websocket = new WebSocket("ws://raptorweb1.no-ip.org:10000");
    websocket.binaryType = "arraybuffer";
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };
    websocket.onopen = function(evt) { onOpen(evt) };
    function onOpen(evt){
        var luser = document.getElementById("lusername").value;
        var ruser = document.getElementById("rusername").value;
        var pwd = document.getElementById("password").value;
        console.log("Connecting.. ");
        websocket.send("SUB[00100]" + luser);
        websocket.send("MESSAGE[00100]" + ruser + "[11111]" + pwd);
        console.log("Connected.");
    }

    function onMessage(evt) {
        console.log("received: " + evt.data);
        drawImageBinary(evt.data);
    }

    function onError(evt) {
        console.log(evt.data);
    }


    function drawImageBinary(blob) {
        var bytes = new Uint8Array(blob);
        // console.log('drawImageBinary (bytes.length): ' + bytes.length);
        var imageData = context.createImageData(canvas.width, canvas.height);
        for (var i=8; i<imageData.data.length; i++) {
            imageData.data[i] = bytes[i];
        }
        context.putImageData(imageData, 0, 0);
        var img = document.createElement('img');
        //img.height = canvas.height;
        //img.width = canvas.width;
        img.src = canvas.toDataURL();
    }
}

这是websocket服务器:

this is the websocket server:

clients = []
from SimpleWebSocketServer import WebSocket, SimpleWebSocketServer,     SimpleSSLWebSocketServer
import zmq
import zmq.auth
from zmq.auth.thread import ThreadAuthenticator
import sys
import os
import random
import pygame
from pygame.locals import *
import base64
import string
from threading import Thread
def id_generator(size=10, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))
class SimpleChat(WebSocket):
    def initZMQ(self):
        file = sys.argv[0]
        base_dir = os.path.dirname(file)
        keys_dir = os.path.join(base_dir, 'certificates')
        public_keys_dir = os.path.join(base_dir, 'public_keys')
        secret_keys_dir = os.path.join(base_dir, 'private_keys')
        self.context = zmq.Context()
        self.socket = self.context.socket(zmq.DEALER)
        client_secret_file = os.path.join(secret_keys_dir, "client.key_secret")
        client_public, client_secret = zmq.auth.load_certificate(client_secret_file)
        self.socket.curve_publickey = client_public
        self.socket.curve_secretkey = client_secret
        server_public_file = os.path.join(public_keys_dir, "server.key")
        server_public, _ = zmq.auth.load_certificate(server_public_file)
        self.socket.curve_serverkey = server_public
        self.width = "0"
        self.height = "0"
    def ondata(self):
        while True:
            try:
                data = self.socket.recv()
                code, self.width = data.split('[55555]')
                data = self.socket.recv()
                code, self.height = data.split('[55555]')
                self.width = int(self.width)
                self.height = int(self.height)
                self.width = float(self.width /1.5)
                self.height = float(self.height /1.5)
                print (self.width, self.height)
                data = self.socket.recv()   
                image = pygame.image.frombuffer(data, (int(self.width),int(self.height)),"RGB")
                randname = id_generator()
                pygame.image.save(image,randname+".png")
                out = open(randname+".png","rb").read()
                self.sendMessage(out)
                print("data sent")
                os.remove(randname+".png")
            except Exception as e:
                print (e)
    def handleMessage(self):
       try:
           message = str(self.data) 
           protocode, msg = message.split("[00100]")
           if protocode == ("SUB"):
               print("SUB")
               self.socket.setsockopt(zmq.IDENTITY, str(msg))
               self.socket.connect("tcp://127.0.0.1:9001")
               Thread(target=self.ondata).start()
           elif protocode == ("MESSAGE"):
               print("MESSAGE")
               msg = str(msg)
               ident, mdata = msg.split("[11111]")
               msg = ('%sSPLIT%s' % (ident, mdata))
               self.socket.send(str(msg))
           else:
               raise Exception
       except Exception as e:
           print (e)

    def handleConnected(self):
       print (self.address, 'connected')
       clients.append(self)
       self.initZMQ()


    def handleClose(self):
       clients.remove(self)
       print (self.address, 'closed')
       for client in clients:
          client.sendMessage(self.address[0] + u' - disconnected')

server = SimpleWebSocketServer('', 10000, SimpleChat)
server.serveforever()


推荐答案

我成功地解决了这个问题。

I managed to solve this problem.

结果我的javascript和我的python服务器错了。

Turns out that my javascript and my python server were wrong.

这是在处理来自服务器的消息时适用的函数:

this is the function that works for me when processing the message from the server:

function onMessage(evt) {
        var img = new Image();
        img.src = "data:image/png;base64,"+evt.data;
        img.onload = function () {
            context.drawImage(img,0,0);
        }
}

我必须在我的服务器上添加一个base64.b64encode在我发送图片之前。

I had to add a base64.b64encode on my server right before I send the picture.

这篇关于javascript HTML5 canvas显示从python websocket服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆