• Lv0
    粉丝0

积分1 / 贡献0

提问1答案被采纳0文章0

作者动态

    websocket 连接正常,客户端可以向服务端发送数据,但是接收不了服务端的数据。求助,大佬帮忙解决。

    方小生 显示全部楼层 发表于 2024-10-10 01:02:15

    【问题描述】

    1. 介绍问题现象和发生的背景 websocket 连接正常,客户端可以向服务端发送数据,但是接收不了服务端的数据。

    2. 相关的代码(请勿使用截图)

      // import webSocket from '@ohos.net.webSocket';
      import Logger from '../model/logger';
      import webSocket from '@ohos.net.webSocket';  // 引入 OpenHarmony 的 WebSocket 模块
      // import Logger from '../util/logger';  // 引入日志工具
      const TAG = "WebSocketDemo";  // 定义日志标签
      
      export class SocketService {
        private socket: webSocket.WebSocket;  // 声明 WebSocket 对象
        private receivedData: Object | null = null;  // 存储接收到的数据
        // private receivedData: Object | null = null;  // 存储接收到的数据
      
        constructor() {
          this.createWebSocket();  // 创建 WebSocket
          this.onOpen();  // 注册连接成功的事件
          this.onMessage();  // 注册消息接收的事件
          this.onClose();  // 注册连接关闭的事件
          this.onError();  // 注册错误事件
        }
      
        /**
         * 创建 WebSocket 对象
         */
        private createWebSocket() {
          Logger.info(TAG, "start create websocket");  // 日志记录开始创建 WebSocket
          this.socket = webSocket.createWebSocket();  // 创建 WebSocket 实例
          Logger.info(TAG, "create socket success");  // 日志记录创建成功
        }
      
        /**
         * 根据指定的 URL 与服务器建立连接
         * @param url - WebSocket 服务器的地址
         */
        public connect(url: string) {
          this.socket.connect(url)  // 连接到 WebSocket 服务器
            .then((isConnect) => {
              if (isConnect) {
                Logger.info(TAG, "connect success");  // 日志记录连接成功
              }
            });
        }
      
        /**
         * 发送消息到服务器
         * @param data - 要发送的数据
         */
        public sendMessage(data: string) {
          this.socket.send(data)  // 发送数据
            .then((isSuccess) => {
              Logger.info(TAG, "send result: " + isSuccess);  // 日志记录发送结果
              if (isSuccess) {
                Logger.info(TAG, "send message success");  // 日志记录发送成功
              }
            })
            .catch((e) => {
              Logger.info(TAG, "send message fail: " + JSON.stringify(e));  // 日志记录发送失败
            });
        }
      
        /**
         * 关闭与服务器的连接
         */
        public closeConnect() {
          this.socket.close();  // 关闭 WebSocket 连接
        }
      
        /**
         * 监听连接打开事件
         */
        private onOpen() {
          this.socket.on("open", (err, data) => {
            Logger.info(TAG, "on open status: " + JSON.stringify(data));  // 日志记录连接打开的状态
          });
        }
      
        /**
         * 监听服务器发送的消息
         */
        private onMessage() {
          this.socket.on("message", (err, data) => {
            if (err) {
              Logger.error(TAG, "Error receiving message: " + JSON.stringify(err));
              return;
            }
      
            Logger.info(TAG, "receive from server: message is: " + JSON.stringify(data));  // 日志记录接收到的消息
            console.log('Received raw data:', data);
      
            this.receivedData = data;  // 存储接收到的数据
            try {
              this.processData(data);  // 处理接收到的数据
            } catch (e) {
              Logger.error(TAG, "Error processing message: " + e.message);
            }
          });
        }
      
        /**
         * 处理接收到的数据
         * @param data - 接收到的数据
         */
        private processData(data: Object) {
          if (data === undefined || data === null) {
            Logger.error(TAG, "Received undefined or null data.");
            return;
          }
      
          if (typeof data === 'string') {
            Logger.info(TAG, "Processing received string data: " + data);
            // 处理字符串数据
            console.log('Received string:', data);
          } else if (typeof data === 'object') {
            Logger.info(TAG, "Processing received object data: " + JSON.stringify(data));
            // 处理对象数据
            console.log('Received object:', data);
          } else {
            Logger.error(TAG, "Received unsupported data type.");
            throw new Error("Received unsupported data type.");
          }
        }
      
        /**
         * 监听连接关闭事件
         */
        private onClose() {
          this.socket.on("close", (err, data) => {
            Logger.info(TAG, "on close: close code is: " + data.code + ", close reason is: " + data.reason);  // 日志记录连接关闭的信息
          });
        }
      
        /**
         * 监听错误事件
         */
        private onError() {
          this.socket.on("error", (data) => {
            Logger.info(TAG, "on error: err is: " + JSON.stringify(data));  // 日志记录错误信息
          });
        }
      }
      
      // 创建 SocketService 的实例
      let socketService = new SocketService();
      
      // 导出 SocketService 实例
      export default socketService;

      服务端代码:

    3. 运行结果、错误截图

    4. 我尝试过的解决方法和结果

    5. 我想要达到的结果

    import asyncio import websockets import rospy from nav_msgs.msg import Odometry from geometry_msgs.msg import Pose2D from kobuki_msgs.msg import BatteryInfo import json import subprocess import os import signal import threading

    class WebSocketServer: def init(self, host, port): rospy.init_node("websocket_server") self.json_data = "" self.battery_data = "" self.host = host self.port = port try: port_pid = subprocess.check_output(["lsof", "-i", f":{self.port}"]).decode().split()[10] print(f"端口{self.port}已被占用,PID为{port_pid}") os.kill(int(port_pid), signal.SIGKILL) except subprocess.CalledProcessError: pass rospy.loginfo("WebSocket服务器初始化成功!") rospy.Subscriber("/pose_data", Pose2D, self.pose_callback) rospy.Subscriber("/mobile_base/debug/battery_info", BatteryInfo, self.battery_callback)

        self.websocket = None  # 存储当前连接的WebSocket
    
    def battery_callback(self, msg):
        self.battery_data = msg.battery_voltage
    
    def pose_callback(self, msg):
        self.json_data = "get_pose"+","+str(msg.x)+","+str(msg.y)+","+str(msg.theta)
    
    
    async def send_message(self):
        while self.websocket is not None:
            await asyncio.sleep(5)
            # message = str({"event" : "test","x": 0,"y": 0,"z": 0,"battery": self.battery_data})
            message = 'x:1.0,y:2.0,z:3.0,battery'
            print(f"发送消息: {message}")
            try:
                await self.websocket.send(message)
                print(f"发送消息: {message}")
            except websockets.ConnectionClosed:
                print("客户端连接已关闭,无法发送消息。")
                break
    
    async def echo(self, websocket, path):
        self.websocket = websocket
        client_address = websocket.remote_address
        print(f"客户端连接: {client_address}")
        await websocket.send("ok")
    
        # 启动定时发送消息的协程
        # asyncio.create_task(self.send_message())
    
        try:
            async for message in websocket:
                print(f"收到消息: {message} 从客户端: {client_address}")
    
    
                data = b"ok"  # 字节串
                text_data = data.decode('utf-8')  # 解码成字符串
                await websocket.send(json.dumps(text_data))
                print(f"发送消息: ok")
    
    
        except websockets.ConnectionClosed:
            print(f"客户端 {client_address} 已关闭连接。")
        finally:
            self.websocket = None  # 清空WebSocket引用
    
    async def main(self):
        async with websockets.serve(self.echo, self.host, self.port):
            print("服务器启动成功!")
            await asyncio.Future()
    
    def run(self):
        try:
            asyncio.run(self.main())
        except KeyboardInterrupt:
            print("服务器已关闭!")
            asyncio.get_event_loop().close()
    

    【运行环境】

    硬件:鲁班猫 ROM版本: DevEvoStudio版本:DevEco Studio 3.1.1 Release SDK版本:API9

    您尚未登录,无法参与评论,登录后可以:
    参与开源共建问题交流
    认同或收藏高质量问答
    获取积分成为开源共建先驱

    精彩评论2

    fengyunrenwu

    沙发 发表于 2024-10-12 15:35:37
    可以参考一下哈:
    import { webSocket } from '@kit.NetworkKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    import util from '@ohos.util';

    async function TestWebSocketStringWs() {
    const web = webSocket.createWebSocket();
    web.on('message', (err: BusinessError, data: string | ArrayBuffer) => {
    if (err) {
    console.error('TestWebSocket ' + JSON.stringify(err));
    }
    if (typeof data === 'string') {
    console.info('TestWebSocket get string: ' + data);
    } else {
    const view = new Uint8Array(data);
    const res = util.TextDecoder.create('utf-8').decodeWithStream(view);
    console.info('TestWebSocket get ArrayBuffer: ' + res);
    }
    });
    web.on('open', () => {
    const sendData = 'Hello World';
    web.send(sendData);
    });
    await web.connect('ws://192.168.0.167:8888/string');
    }

    async function TestWebSocketStringWss() {
    const web = webSocket.createWebSocket();
    web.on('message', (err: BusinessError, data: string | ArrayBuffer) => {
    if (err) {
    console.error('TestWebSocket ' + JSON.stringify(err));
    }
    if (typeof data === 'string') {
    console.info('TestWebSocket get string: ' + data);
    } else {
    const view = new Uint8Array(data);
    const res = util.TextDecoder.create('utf-8').decodeWithStream(view);
    console.info('TestWebSocket get ArrayBuffer: ' + res);
    }
    });
    web.on('open', () => {
    const sendData = 'Hello World';
    const buffer = new ArrayBuffer(sendData.length);
    util.TextEncoder.create('utf-8').encodeIntoUint8Array(sendData, new Uint8Array(buffer));
    web.send(buffer);
    });
    await web.connect('ws://192.168.0.167:8888/binary');
    }
    @Entry
    @Component
    struct Index {
    @State message: string = 'Hello World';
      build() {
         Row() {
           Column() {
               Text('TestWebSocketStringWs')
         .fontSize(50)
         .fontWeight(FontWeight.Bold)
         .onClick(TestWebSocketStringWs)
      Text('TestWebSocketStringWs')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(TestWebSocketStringWss)
    }
        .width('100%')
    }
         .height('100%')
    }
    }

    方小生

    板凳 发表于 2024-10-12 23:49:01
    解决了,是我代码问题

    Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

    返回顶部