软艺坊 2024-05-24 12:16 采纳率: 80%
浏览 41
已结题

鸿蒙应用无法建立websocket连接

websocket连接,页面可以正常建立websocket连接,鸿蒙应用参照的官网例子无法建立连接。

img


```typescript
import webSocket from '@ohos.net.webSocket';

@Entry
@Component
struct Index10 {
  @State message: string = 'Hello World'
  defaultIpAddress = "ws://127.0.0.1:8080";
  ws = webSocket.createWebSocket();

  onPageShow(){
    this.ws.connect(this.defaultIpAddress, (err, value) => {
      if (!err) {
        console.log("连接成功!");
      } else {
        console.log("连接失败:" + JSON.stringify(err));
      }
    });
    this.ws.on('open', (err, value) => {
      if(!err){
        console.log("已打开连接:" + JSON.stringify(value));
        // 当收到on('open')事件时,可以通过send()方法与服务器进行通信
        this.ws.send("Hello, server!", (err, value) => {
          if (!err) {
            console.log("信息发送成功!");
          } else {
            console.log("发送失败:" + JSON.stringify(err));
          }
        });
      }else{
        console.log('连接打开失败:',JSON.stringify(err));
      }
    });
    this.ws.on('message', (err, value) => {
      console.log("接收到信息:" + JSON.stringify(value));
      // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接
      if (value === 'bye') {
        this.ws.close((err, value) => {
          if (!err) {
            console.log("连接关闭成功!");
          } else {
            console.log("连接关闭失败: " + JSON.stringify(err));
          }
        });
      }
    });
    this.ws.on('close', (err, value) => {
      console.log("链接已关闭!" + JSON.stringify(value)+JSON.stringify(err));
    });
    this.ws.on('error', (err) => {
      console.log("连接发生错误:" + JSON.stringify(err));
    });
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button('send').onClick(()=>{
          this.ws.send('hello!!!!!!!!!!!!!!!!!!');
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}


```

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-24 12:17
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,看起来您的鸿蒙应用在尝试通过Websocket与服务器建立连接时遇到了问题。尽管在浏览器环境中一切正常,但在鸿蒙应用中却出现了连接打开后立即关闭并报告未知类型的情况。为了帮您解决这个问题,我们可以从以下几个方面入手:

    1. 检查URL是否正确:确保使用的地址(ws://127.0.0.1:8080)是正确的,并且服务器端确实运行在该地址上。

    2. 确保服务器支持Websocket协议:检查您的服务器是否启用了Websocket功能,并且兼容鸿蒙设备的Websocket实现。

    3. 鸿蒙环境特定的问题:有时,不同平台可能对Websocket的支持存在差异,确保您的代码针对鸿蒙进行了适配。

    4. 错误处理:增加更详细的错误日志,以便更好地理解问题所在。

    基于以上建议,您可以尝试修改代码,添加更多的日志输出,以便跟踪问题。同时,确保您的服务器端也支持Websocket协议。

    以下是修改后的代码示例:

    import webSocket from '@ohos.net.webSocket';
    
    @Entry
    @Component
    struct Index10 {
      @State message: string = 'Hello World';
      defaultIpAddress = "ws://127.0.0.1:8080";
      ws = webSocket.createWebSocket();
    
      async onPageShow() {
        try {
          await this.ws.connect(this.defaultIpAddress);
          console.log("连接成功!");
        } catch (connectErr) {
          console.error("连接失败:" + JSON.stringify(connectErr));
          return;
        }
    
        this.ws.on('open', (err, value) => {
          if (err) {
            console.error('连接打开失败:', JSON.stringify(err));
            return;
          }
          console.log("已打开连接:" + JSON.stringify(value));
    
          this.ws.send("Hello, server!");
        });
    
        this.ws.on('message', (err, value) => {
          if (err) {
            console.error("接收消息失败:" + JSON.stringify(err));
            return;
          }
          console.log("接收到信息:" + JSON.stringify(value));
        });
    
        this.ws.on('close', (err, value) => {
          if (err) {
            console.error("连接关闭失败:" + JSON.stringify(err));
            return;
          }
          console.log("链接已关闭!" + JSON.stringify(value));
        });
    
        this.ws.on('error', (err) => {
          console.error("连接发生错误:" + JSON.stringify(err));
        });
      }
    
      build() {
        Row() {
          Column() {
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
            Button('send').onClick(async ()=>{
              try {
                await this.ws.send('hello!!!!!!!!!!!!!!!!!!');
              } catch (sendErr) {
                console.error("发送消息失败:" + JSON.stringify(sendErr));
              }
            })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    

    这个版本的代码增加了错误处理,并将发送和连接操作包装在了try/catch块内,这样可以捕获潜在的异常并打印出更详细的错误信息。

    如果问题仍然存在,请提供更多关于服务器端的配置和代码信息,以便我们进一步排查。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月24日