原生websocket在python client连spring service

[toc]

为什么要这样做

博主要寒假回家我的文竹要有人浇水,因此要搞一个自动浇花的. 看了很多解决方案,这个websocket长连接加主动推送感觉很合适. 毕竟我要通过手机来远程控制,这样通过手机访问服务器,然后服务器发送控制命令到控制装置(websocket协议)正好;

stomp

以前博主也搞过stomp 加 sockjs 的 因为在python上与服务器上java后台连接,所以要配置一下java

以前的博客能帮你了解一下websockethttps://boke.maoxiaomiyy.com/?p=971
要想不使用sockjs 就只要把原来的stompEndpointRegistry.addEndpoint("/my-websocket").withSockJS();中.withSockJS()去掉即可

配置代码如下

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/my-websocket");
    }
}

stomp的修改参考:https://segmentfault.com/a/1190000006617344
在stomp的生成是 如果是sockjs 就使用

var socket = new SockJS('/my-websocket'); //1
stompClient = Stomp.over(socket);

没有sockjs 就是原生url连接即可

stompClient=Stomp.client("ws://localhost:5002/my-websocket");
stompClient.connect({}, function(frame) {//3
    stompClient.subscribe('/chat', function(respnose){ //4
        alert("olll")
        alert(respnose.date);
    });
});

原生配置

网上大部分都是基于stomp 和sockjs的
我这是原生的 spring websocket

@Configuration
@EnableWebSocket
public class WebSocketBaseConf implements WebSocketConfigurer {
    class MyHandler extends TextWebSocketHandler{
        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) {
            //System.out.println(message);
            System.out.println(message.getPayload());

            try {
                session.sendMessage(new TextMessage("ke yi de"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
        webSocketHandlerRegistry.addHandler(new MyHandler(), "/myHandler");
    }
}

前端

var ws=new WebSocket("ws://localhost:5002/myHandler");
ws.onopen=function () {
    // ws.send("we are ok");
    console.info("连接成功");
}
ws.onmessage=function (msg) {
    console.info(msg);
    $("#webinfo").html(msg.data);
}

点击: 原生websocket看spring官方文档

python 的websocket客户端

在python官网上找到一个例子可以使用的
点击查看:https://pypi.python.org/pypi/websocket-client

首先安装模块 pip install websocket-client 树莓派上要su权限


import websocket import mywebsocket def on_message(ws, message): print(message); #ws.send("已收到"); mywebsocket.readOp(message); def on_error(ws, error): print(error) def on_close(ws): print("### closed ###") def on_open(ws): print("到 zhe") #print("zhe li") ws.send("jjj") if __name__ == "__main__": ws = websocket.WebSocketApp("ws://localhost:5002/myHandler", on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open print("ok") ws.run_forever()

ws.run_forever是为了保持长连接的, 然后是模仿js的使用方式

在接受数据后就可以在 on_message中处理了,我是写了另外一个处理文件的,毕竟gpio

结语

至此整个框架搭建完毕,明天开始开发网页控制,和树莓派的gpio


评论

《“原生websocket在python client连spring service”》 有 1 条评论

  1. […] 手机访问服务器获取登录然后进入控制页面; 树莓派python 使用websocket进行长连接 手机在web页面上进行操作,并发送请求到服务器,服务器通过websocket发送指令到树莓派,然后python解析指令,并操控继电器进而操控水泵; 网络传输代码介绍:上一篇的:原生websocket在python […]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注