zoukankan      html  css  js  c++  java
  • web socket 入门

    WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,其优雅地解决了以往web服务器不能向web客户端实时推送消息的问题。

    在浏览器js环境中,创建一个websocket对象如下所示:

    var ws = New WebSocket(url, [protocol])

     第一个参数 url, 指定连接的 URL,一般web服务器会对这个url进行特殊的处理,一般会用实现了websocket协议的handler处理websocket请求。

    第二个参数 protocol 是可选的,指定了可接受的子协议。

    WebSocket事件

    websocket提供了四个回调函数,分别用来处理open,close,message,error四个事件,即ws.onopen,ws.onclose,ws.onmessage,ws.onerror

    举个栗子:

    var ws_req = {
    socket: null,
    start: function() {
    var Is_Flash_running = false;
    var total_fail_count = 0;
    if ("WebSocket" in window) {
    var url = "ws://" + location.host + "/socket_req";
    if (ws_req.socket){
    ws_req.socket.close();
    }
    ws_req.socket = new WebSocket(url);
    ws_req.socket.onopen = function() {
    console.log("Opening a connection...");
    ws_req.socket.send("connect to web server......")
    };
    ws_req.socket.onclose = function(evt) {
    console.log("I'm sorry. Bye!");
    };
    ws_req.socket.onerror = function(evt) {
    console.log("ERR: " + evt.data);
    };
    ws_req.socket.onmessage = function(event) {
    try {
    handleMessage(event.data);
    } catch (err) {
    console.log(err);
    }
    }
    } else {
    alert('你的浏览器太落伍了,换用高版本的chrome内核浏览器吧!!!');
    }
    },
    }
    ws_req.start();

    var handleMessage = function(data){
    //
    }

    web服务器实现:

    笔者使用的后端开发语言是python,用的是Tornado web框架,tornado.websocket已经封装了websocket的协议,我们仅需简单的调用即可

    import tornado.web
    import tornado.websocket
    import traceback

    from device_serial_load import DevSerialLoadHandler
    class LoadDevSerialSocketHandler(tornado.websocket.WebSocketHandler): client = set() def get_compression_options(self): # Non-None enables compression with default options. return {} def open(self): LoadDevSerialSocketHandler.client.add(self) def on_close(self): LoadDevSerialSocketHandler.client.remove(self) try: self.dslhler.dev_serial_load_client.stop() except Exception, e: logger.info('close socket client') def send_msg_to_broswer(self, msg): try: self.write_message(msg) return True except: logger.error(str(msg) + '发送失败') self.close() return False def on_message(self, message): message_json = json.loads(message) if "NodeID" in message_json and "LineNum" in message_json : node_ip = TestNodeData().get_node_ip(message_json["NodeID"]) line_num = message_json["LineNum"][2] self.dslhler = DevSerialLoadHandler(node_ip, line_num, self.send_msg_to_broswer) self.dslhler.start() elif "InputMessage" in message_json: try: if message_json["InputMessage"] == "None": # 支持网页仅回车键的发送 self.dslhler.dev_serial_load_client.client.send(" ") else: self.dslhler.dev_serial_load_client.client.send(message_json["InputMessage"]) except Exception, e: logger.error(e) logger.error(traceback.format_exc()) logger.error("send input message to dev serial fail") self.send_msg_to_broswer("<span style='color:red;font-size:20px'>ATCServer:[串口命令发送失败]</span> ")

    上诉代码将串口打印通过websocket实时的传输到web页面显示

  • 相关阅读:
    一、maven的安装及配置
    Mybatis分页助手PageHelper
    $('#itemAddForm').form('reset');重置表单是报错?
    个人遇到的几种Date类型处理方式
    eclipse中tomcat的add and remove找不到项目
    print,printf,println的区别,以及 , , 的区别
    linux权限问题,chmod命令
    前后端分离怎么部署
    linux安装jdk
    springboot jar包方式部署
  • 原文地址:https://www.cnblogs.com/linyihai/p/7003038.html
Copyright © 2011-2022 走看看