123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- <template>
- <page-head title="websocket通讯示例"></page-head>
- <view class="uni-padding-wrap">
- <view class="uni-btn-v">
- <text class="websocket-msg">{{ showMsg }}</text>
- <button class="uni-btn-v" type="primary" @click="connect">
- 连接websocket服务
- </button>
- <button class="uni-btn-v" v-show="connected" type="primary" @click="send">
- 发送一条消息
- </button>
- <button class="uni-btn-v" type="primary" @click="close">
- 断开websocket服务
- </button>
- <text class="websocket-tips">发送消息后会收到一条服务器返回的消息(与发送的消息内容一致)</text>
- <text class="websocket-tips">web端和小程序端uni-push功能、app-android端和app-ios端的web-view组件日志回显、app-harmony端的日志回显会占用一个socket链接,此时使用全局的socket api会引发混乱。应使用socketTask操作websocket链接。</text>
- <text class="websocket-tips">小程序端日志回显功能也会占用一个socket链接,如果不希望使用此功能可以在HBuilderX控制台关闭日志回显。</text>
- <button class="uni-btn-v" type="primary" @click="goSocketTask">
- 跳转 socketTask 示例
- </button>
- </view>
- </view>
- </template>
- <script>
- export default {
- data() {
- return {
- connected: false,
- connecting: false,
- msg: '',
- roomId: '',
- platform: '',
- }
- },
- computed: {
- showMsg() : string {
- if (this.connected) {
- if (this.msg.length > 0) {
- return '收到消息:' + this.msg
- } else {
- return '等待接收消息'
- }
- } else {
- return '尚未连接'
- }
- },
- },
- onLoad() {
- this.platform = uni.getDeviceInfo().platform as string
- },
- onUnload() {
- uni.closeSocket({
- code: 1000,
- reason: 'close reason from client',
- success: (res : any) => {
- console.log('uni.closeSocket success', res)
- },
- fail: (err : any) => {
- console.log('uni.closeSocket fail', err)
- },
- } as CloseSocketOptions)
- uni.hideLoading()
- },
- methods: {
- connect() {
- if (this.connected || this.connecting) {
- uni.showModal({
- content: '正在连接或者已经连接,请勿重复连接',
- showCancel: false,
- })
- return
- }
- this.connecting = true
- uni.showLoading({
- title: '连接中...',
- })
- uni.connectSocket({
- url: 'wss://websocket.dcloud.net.cn',
- header: null,
- protocols: null,
- success: (res : any) => {
- // 这里是接口调用成功的回调,不是连接成功的回调,请注意
- console.log('uni.connectSocket success', res)
- },
- fail: (err : any) => {
- // 这里是接口调用失败的回调,不是连接失败的回调,请注意
- console.log('uni.connectSocket fail', err)
- },
- })
- uni.onSocketOpen((res) => {
- this.connecting = false
- this.connected = true
- uni.hideLoading()
- uni.showToast({
- icon: 'none',
- title: '连接成功',
- })
- console.log('onOpen', res)
- })
- uni.onSocketError((err) => {
- this.connecting = false
- this.connected = false
- uni.hideLoading()
- uni.showModal({
- content: '连接失败,可能是websocket服务不可用,请稍后再试',
- showCancel: false,
- })
- console.log('onError', err)
- })
- uni.onSocketMessage((res) => {
- if(res.data instanceof ArrayBuffer){
- var int8 = new Int8Array(res.data)
- this.msg = int8.toString()
- console.log('onMessage', res)
- }else{
- this.msg = res.data as string
- console.log('onMessage', res)
- }
- })
- uni.onSocketClose((res) => {
- this.connected = false
- this.msg = ''
- console.log('onClose', res)
- })
- },
- send() {
- uni.sendSocketMessage({
- data:
- 'from ' +
- this.platform +
- ' : ' +
- parseInt((Math.random() * 10000).toString()).toString(),
- success: (res : any) => {
- console.log(res)
- },
- fail: (err : any) => {
- console.log(err)
- },
- } as SendSocketMessageOptions)
- },
- close() {
- uni.closeSocket({
- code: 1000,
- reason: 'close reason from client',
- success: (res : any) => {
- console.log('uni.closeSocket success', res)
- },
- fail: (err : any) => {
- console.log('uni.closeSocket fail', err)
- },
- } as CloseSocketOptions)
- },
- goSocketTask() {
- uni.navigateTo({
- url: '/pages/API/websocket/socketTask',
- })
- }
- },
- }
- </script>
- <style>
- .uni-btn-v {
- padding: 5px 0;
- }
- .uni-btn-v {
- margin: 10px 0;
- }
- .websocket-msg {
- padding: 40px 0px;
- text-align: center;
- font-size: 14px;
- line-height: 40px;
- color: #666666;
- }
- .websocket-tips {
- padding: 10px 0px;
- text-align: center;
- font-size: 14px;
- line-height: 24px;
- color: #666666;
- }
- </style>
|