HarmonyOS socketio使用demo

HarmonyOS
2024-12-25 18:15:57
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Excelsior_abit

请参考示例如下:

import prompt from '@ohos.promptAction';
import { client_socket } from '@ohos/socketio';
import router from '@ohos.router';

@Entry
@Component
struct Index {
  @State uri: string = "http://"
  @State username: string = "";
  @State message: string = "";
  @State connect_finish: boolean = false;
  @State login_finish: boolean = false;
  // private chatDetailData = new ChatDetailData();
  private client: client_socket = new client_socket();
  private scroller: Scroller = new Scroller();

  on_open(): void {
    console.log("SOCKET_IO_INDEX on_open");
    this.connect_finish = true;
    prompt.showToast({ message: "连接服务器成功" });
  }

  on_fail(): void {
    console.log("SOCKET_IO_INDEX on_fail");
  }

  on_reconnecting(): void {
    console.log("SOCKET_IO_INDEX on_reconnecting");
  }

  on_reconnect(): void {
    console.log("SOCKET_IO_INDEX on_reconnect");
  }

  on_close(reason: string): void {
    this.connect_finish = false;
    console.log("SOCKET_IO_INDEX on_close: " + reason);
  }

  on_socket_open(nsp: string): void {
    console.log("SOCKET_IO_INDEX on_socket_open: " + nsp);
  }

  on_socket_close(nsp: string): void {
    console.log("SOCKET_IO_INDEX on_socket_close: " + nsp);
  }

  on_login_listener(event_json: string): void {
    console.log("SOCKET_IO_INDEX on_login_listener: " + event_json);
    // let loginCall = JSON.parse(event_json);
    // let notice = "Welcome to Socket.IO Chat,there " + (loginCall.numUsers != 1 ? " are " : "\'s ") + loginCall.numUsers + (loginCall.numUsers != 1 ? " participants" : " participant");
    // let serviceMessage = { message: notice, id: 0 };
    // this.pushData(serviceMessage);
  }

  on_new_message_listener(event_json: string): void {
    console.log("SOCKET_IO_INDEX on_new_message_listener: " + event_json);
    // let messageCall = JSON.parse(event_json);
    // let serviceMessage = { username: messageCall.username, message: messageCall.message, id: 1 };
    // this.pushData(serviceMessage);
  }

  on_user_joined_listener(event_json: string): void {
    console.log("SOCKET_IO_INDEX on_user_joined_listener: " + event_json);
    // let userJoinCall = JSON.parse(event_json);
    // let notice = userJoinCall.username + " joined" + ",there" + (userJoinCall.numUsers != 1 ? " are " : "\'s ") + userJoinCall.numUsers + (userJoinCall.numUsers != 1 ? " participants" : " participant");
    // let serviceMessage = { message: notice, id: 0 };
    // this.pushData(serviceMessage);
  }

  on_user_left_listener(event_json: string): void {
    console.log("SOCKET_IO_INDEX on_user_left_listener: " + event_json);
    // let userLeftCall = JSON.parse(event_json);
    // let notice = userLeftCall.username + " left" + ",there" + (userLeftCall.numUsers != 1 ? "are " : "\'s ") + userLeftCall.numUsers + (userLeftCall.numUsers != 1 ? " participants" : " participant");
    // let serviceMessage = { message: notice, id: 0 };
    // this.pushData(serviceMessage);
  }

  on_emit_callback(emit_callback_json: string): void {
    console.log("SOCKET_IO_INDEX on_emit_callback: " + emit_callback_json);
  }

  pushData(any:ESObject) {
    setTimeout(() => {
      // this.chatDetailData.pushData(any);
    }, 300);
  }

  //配置client
  initClient(uri: string) {
    console.log("SOCKET_IO_INDEX initClient");
    this.client.set_open_listener(this.on_open.bind(this));
    this.client.set_fail_listener(this.on_fail.bind(this));
    this.client.set_reconnecting_listener(this.on_reconnecting.bind(this));
    this.client.set_reconnect_listener(this.on_reconnect.bind(this));
    this.client.set_close_listener(this.on_close.bind(this));
    this.client.set_socket_open_listener(this.on_socket_open.bind(this));
    this.client.set_socket_close_listener(this.on_socket_close.bind(this));
    this.client.connect(uri);
  }

  //配置socket
  initSocket() {
    console.log("SOCKET_IO_INDEX initSocket");
    // this.client.on("new message", this.on_new_message_listener.bind(this));
    // this.client.on("user joined", this.on_user_joined_listener.bind(this));
    // this.client.on("user left", this.on_user_left_listener.bind(this));
    // this.client.on("login", this.on_login_listener.bind(this));
  }

  //登录
  login(username: string) {
    console.log("SOCKET_IO_INDEX login");
    if (!this.connect_finish) {
      prompt.showToast({ message: "暂未连接服务器" });
      return;
    }
    this.client.emit("add user", username);
    this.login_finish = !this.login_finish;
    console.log("SOCKET_IO_INDEX login login_finish: " + this.login_finish);
  }

  //发送消息
  sendMessage(message: string) {
    console.log("SOCKET_IO_INDEX sendMessage");
    if (!this.connect_finish) {
      console.log("SOCKET_IO_INDEX 暂未连接服务器");
      return;
    }
    this.client.emit("new message", message, this.on_emit_callback);
  }

  //退出连接
  close() {
    console.log("SOCKET_IO_INDEX close");
    if (!this.connect_finish) {
      console.log("SOCKET_IO_INDEX 暂未连接服务器");
      return;
    }
    this.client.socket_close();
    this.client.close();
  }

  build() {
    Row() {
      Column() {
        if (this.login_finish) {
          Row() {
            TextInput({ placeholder: "请输入消息,退出聊天室请输入exit", text: this.message })
              .width('80%')
              .onChange((message) => {
                this.message = message
              })
            Button('Send')
              .onClick(() => {
                if (this.message == "exit") {
                  this.close()
                  this.login_finish = false
                } else if (this.message == "") {
                  prompt.showToast({ message: "请输入消息" });
                } else {
                  this.sendMessage(this.message)
                  let clientMessage: object = new Object(
                    { username: this.username, message: this.message, id: 2 }
                  )
                  this.pushData(clientMessage)
                  this.message = ""
                }
              })
              .width('20%')
          }
          .height('10%')
          .width('100%')
        } else {
          TextInput({ placeholder: "请输入socket.io服务端地址", text: this.uri })
            .onChange((uri) => {
              this.uri = uri
            })
          Button('Connect')
            .margin(20)
            .onClick(() => {
              this.initClient(this.uri)
              this.initSocket()
            })
          TextInput({ placeholder: "请输入用户名" })
            .onChange((username) => {
              this.username = username
            })
          Button('Login')
            .margin(20)
            .onClick(() => {
              this.login(this.username)
            })
          Button('进入自测界面')
            .margin(20)
            .onClick(() => {
              router.pushUrl({
                url: 'pages/MyTestPage'
              })
            })

        }
      }
      .width('100%')
    }
    .height('100%')
  }
}

@Component
struct ChatItemView {
  private message: ESObject

  build() {
    Column() {
      if (this.message.id == 0) {
        Row() {
          Text(this.message.message)
        }
        .width("100%")
        .justifyContent(FlexAlign.Center)
        .margin({ top: 15 })
      }
      else if (this.message.id == 1) {
        // 聊天页面对方的消息
        Row() {
          Text(this.message.username + ":" + this.message.message)
        }
        .width("100%")
        .alignItems(VerticalAlign.Top)
        .margin({ top: 15 })
        .padding({ right: 50 })
      } else {
        // 聊天页面本人消息
        Row() {
          Text(this.message.username + ":" + this.message.message)
        }
        .alignItems(VerticalAlign.Top)
        .width("100%")
        .direction(Direction.Rtl)
        .padding({ left: 50 })
        .margin({ top: 15 })
      }
    }
  }
}
分享
微博
QQ
微信
回复
2024-12-25 19:43:08
相关问题
HarmonyOS iconfont使用demo
202浏览 • 1回复 待解决
requestPermissionsFromUser使用Demo
1663浏览 • 1回复 待解决
HarmonyOS 消息通知使用示例demo
621浏览 • 1回复 待解决
使用Web组件下载能力Demo
692浏览 • 1回复 待解决
HarmonyOS 申请使用webview场景的demo
640浏览 • 1回复 待解决
HarmonyOS 粘贴板如何使用Demo
80浏览 • 1回复 待解决
HarmonyOS 密钥库RSA算法的使用demo
155浏览 • 1回复 待解决
HarmonyOS web-view的使用以及demo
255浏览 • 1回复 待解决
使用文档中demo,获取不到font信息
1763浏览 • 1回复 待解决
使用华为账号DEMO需要应用上架么
1030浏览 • 1回复 待解决
HarmonyOS 曲线demo
128浏览 • 1回复 待解决
HarmonyOS 商城demo
145浏览 • 1回复 待解决
HarmonyOS 身份信息demo
121浏览 • 1回复 待解决
HarmonyOS jsbridge功能demo
129浏览 • 1回复 待解决
HarmonyOS 缓存demo验证
136浏览 • 1回复 待解决
HarmonyOS 自动重启demo
111浏览 • 1回复 待解决
HarmonyOS 地区选择demo
148浏览 • 1回复 待解决
HarmonyOS 录制相关demo
67浏览 • 1回复 待解决