精华内容
下载资源
问答
  •  自行搭建websocket服务,时间成本和技术成本较高,故寻找第三方服务。经检索,发现goeasy、LeanCloud、野狗云,三家“实时通信引擎”服务商,分析文档考虑价格、便捷性,决定用野狗。项目分析 “我和女神的故事”...

    背景

            这次想开发一个双屏互动的案例,考虑到数据实时性及ajax轮询对服务器的压力,尝试用websocket来实现。

            自行搭建websocket服务,时间成本和技术成本较高,故寻找第三方服务。经检索,发现goeasy、LeanCloud、野狗云,三家“实时通信引擎”服务商,分析文档考虑价格、便捷性,决定用野狗。


    项目分析

            “我和女神的故事”H5的玩法逻辑是:

            第一步,用户A进入链接显示二维码“页面一”;

            第二步,用户B扫描二维码配对成功显示“页面三”,用户A则显示“页面二”;

            第三步,用户B点击送花按钮,鲜花由“页面三”飞入“页面二”,实现屌丝给女神送花互动。



            开发思路(二维码->配对成功->开始互动):
            第一部手机,随机生成roomID(创建房间);
            第二部手机,通过roomID(扫描二维码)进行匹配;
            第二部手机,点击交互,两部手机分别播放相应动画。

            数据库结构
            一级:room
            二级:         roomID(唯一性)
            三级:                        pairState(配对状态 false/true)  

                                             emitState(发射状态 false/true)

            数据在野狗里显示为下图:

            


    实现

            按照野狗的文档,先初始化实例,分为三步,第一步创建应用,第二步安装SDK(cocos要导为插件,如果是html直接引入javascript即可),第三步创建Sync实例。

            用户A代码部分,

            写入数据,set() 方法用于向指定节点写入数据,

            // 用户A,创建房间
            var roomID = this.getRandChar(3); // 房间ID,时间戳+随机数
            ref.child("rooms/" + roomID).set({
                "pairState": false, // 初始化配对状态
                "emitState": false  // 初始化发射状态 
            }, function(error) {
                if (error == null){
                    // 数据同步到野狗云端成功完成
                    // 显示出二维码“页面一”
                }
            });

    (生成二维码的方法见《html5网页及Cocos中生成二维码》)

            监听数据,on() 或 once() 方法用于监听节点的数据,update() 方法用于更新指定子节点,

            // 用户A,监测配对状态
            ref.child("rooms/" + roomID + "/pairState").on('value', function(data) { 
                if(data.val()){
                    // 配对成功,显示“页面二”
                }
            }, function(error) {
            });
            // 用户A,监测发射状态
            ref.child("rooms/" + roomID + "/emitState").on('value', function(data) { 
                if(data.val()){
                    // 监测到发射状态为true,播放“收到鲜花”的动效
    
                    // 恢复发射状态为false
                    ref.child("rooms/" + roomID).update({
                        "emitState": false
                    }, function(error) {
                        if (error == null){
                            // 数据同步到野狗云端成功完成
                        }
                    });
                }
            }, function(error) {
            });


            用户B代码部分,

            // 用户B,更新配对状态
            this.roomID = this.getUrlParam("roomID"); // 通过扫描二维码打开带有房间ID参数的链接,获取房间ID
            
            this.ref.child("rooms/" + this.roomID).update({
                "pairState": true
            }, function(error) {
                if (error == null){
                    // 数据同步到野狗云端成功完成
                    // 配对成功,显示“页面三”
                }
            });

            点击送花按钮,

            // 用户B,更新发射状态
            this.ref.child("rooms/" + this.roomID).update({
                "emitState": true
            }, function(error) {
                if (error == null){
                    // 数据同步到野狗云端成功完成
                    // 播放“送出鲜花”的动效
                }
            });

            要注意一点,在写代码时一定要把访问数据的路径写对。

            在cocos里鲜花用到了对象池和动画,没有什么难点。以上就完成了项目。


    Demo二维码

            


    BTW

            1、通过这次Demo发现,这是个纯前端的开发,根本没涉及到接口和数据库。这种“无后端开发”对于轻量级的H5开发来说确实便捷,接口数据库这些都不需要自行开发,会节省大量的开发时间。

            2、野狗是分服务等级的,对日活跃设备数有限制。正式项目的开发,要考虑流量及成本来决定是否采用此服务。

            3、分析几个“双屏互动H5案例”(链接在底部),案例2奔驰采用的websocket、案例3杜蕾斯用的ajax,所以双屏互动开发websocket并不是唯一的选择。后续分享一篇使用阿里云(ECS+RDS)实现交互的博文


    参考链接

            野狗说明文档:https://docs.wilddog.com/sync/Web/index.html

            goeasy说明文档:http://goeasy.io/resources/www/docs/goeasy-reference-0.1.18-cn.pdf

            LeanCloud说明文档 :https://leancloud.cn/docs/js_realtime.html

            高大上的双屏互动,你玩过了吗?【双屏互动H5欣赏】:https://www.iguoguo.net/2015/58411.html

            WebSocket实现多屏互动的分析及方案:https://blog.csdn.net/u012889638/article/details/50586783

            简单理解Socket:http://www.cnblogs.com/dolphinX/p/3460545.html

            leancloud和野狗有什么区别,优势在哪?:https://www.zhihu.com/question/37301314


           为什么创业公司不再需要后端工程师?:

    https://cn.technode.com/post/2015-03-16/do-not-need-backend-engineer/

    展开全文
  • 1. AndroidAsyn使用:Gradle:dependencies { compile 'com.koushikdutta.async:androidasync:2.+' }使用方式:AsyncHttpClient.getDefaultInstance().websocket("ws://192.168.250.38:8181",// webSocket地址"8181",...

    1. AndroidAsyn

    使用:

    Gradle:

    dependencies { compile 'com.koushikdutta.async:androidasync:2.+' }

    使用方式:

    AsyncHttpClient.getDefaultInstance().websocket(

    "ws://192.168.250.38:8181",// webSocket地址

    "8181",// 端口

    new AsyncHttpClient.WebSocketConnectCallback() {

    @Override

    public void onCompleted(Exception ex, WebSocket webSocket) {

    if (ex != null) {

    ex.printStackTrace();

    return;

    }

    webSocket.send("a string");// 发送消息的方法

    webSocket.send(new byte[10]);

    webSocket.setStringCallback(new WebSocket.StringCallback() {

    public void onStringAvailable(String s) {

    Log.i(TAG, "onStringAvailable: " + s);

    }

    });

    webSocket.setDataCallback(new DataCallback() {

    public void onDataAvailable(DataEmitter emitter, ByteBufferList byteBufferList) {

    System.out.println("I got some bytes!");

    // note that this data has been read

    byteBufferList.recycle();

    }

    });

    }

    });

    2.autobahn

    使用:

    private WebSocketConnection mConnect = new WebSocketConnection();

    String url = "ws://192.168.250.38:8181/";

    public void init() {

    try {

    mConnect.connect(url, new WebSocketHandler() {

    @Override

    public void onOpen() {

    Log.i(TAG, "onOpen: ");

    }

    @Override

    public void onTextMessage(String payload) {

    Log.i(TAG, "onTextMessage: "+payload);

    }

    @Override

    public void onClose(int code, String reason) {

    Log.i(TAG, "onClose: " + code + "|" + reason);

    }

    });

    } catch (WebSocketException e) {

    e.printStackTrace();

    }

    }

    3.java-webSocket

    使用:

    private String address = "ws://192.168.250.38:8181/";

    private URI uri;

    private static final String TAG = "JavaWebSocket";

    public void initSockect() {

    try {

    uri = new URI(address);

    } catch (URISyntaxException e) {

    e.printStackTrace();

    }

    if (null == mWebSocketClient) {

    mWebSocketClient = new WebSocketClient(uri) {

    @Override

    public void onOpen(ServerHandshake serverHandshake) {

    Log.i(TAG, "onOpen: ");

    }

    @Override

    public void onMessage(String s) {

    Log.i(TAG, "onMessage: " + s);

    }

    @Override

    public void onClose(int i, String s, boolean b) {

    Log.i(TAG, "onClose: ");

    }

    @Override

    public void onError(Exception e) {

    Log.i(TAG, "onError: ");

    }

    };

    mWebSocketClient.connect();

    }

    }

    4.Netty

    参考

    展开全文
  • 怎么使用webSocket中的第三方socket.io包 http 协议 http中文意思: 超文本传输协议, 定义服务器和客户端的传送格式 请求发送的数据包, 叫请求报文, 格式如下 响应回来的数据包, 叫响应报文, 格式如下 ...

    在这里插入图片描述

    什么是webSocket?怎么使用webSocket中的第三方socket.io包

    http 协议

    1. http中文意思: 超文本传输协议, 定义服务器和客户端的传送格式

    2. 请求发送的数据包, 叫请求报文, 格式如下

    在这里插入图片描述

    1. 响应回来的数据包, 叫响应报文, 格式如下

    在这里插入图片描述

    HTTP 协议:客户端与服务器建立通信连接之后,服务器端只能被动地响应客户端的请求,无法主动给客户端发送消息。

    一次请求才能对应一次响应

    由于 http 是一次请求对应一次响应,无法达到即时通信的效果,所以在后面的 html5 中提出了一个新的协议 websocket 来实现即时通信的效果

    什么是 websocket

    websocket 是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通 信的协议,这个对比着 HTTP 协议来说,HTTP 协议是一种无状态的、无连接的、单向的应 用层协议,通信请求只能由客户端发起,服务端对请求做出应答处理。HTTP 协议无法实现 服务器主动向客户端发起消息,websocket 连接允许客户端和服务器之间进行全双工通信, 以便任一方都可以通过建立的连接将数据推送到另一端。websocket 只需要建立一次连接, 就可以一直保持连接状态

    socket.io包使用

    1. 安装socket.io包

    npm install socket.io-client@4.0.0 -D
    //
    yarn add socket.io-client@4.0.0 -D
    

    2. 在组件内引入包

    // 导入 socket.io-client 包
    import { io } from 'socket.io-client'
    
    // 定义变量,存储 websocket 实例
    let socket = null
    

    3. 创建socket服务

    created() {
        // ...
        
        // 创建客户端 websocket 的实例
        socket = io('http://地址', {
            query: {
                token: this.token
            },
            transports: ['websocket']
        })
    }
    

    4. 监听是否连接成功

    只有连接内置事件执行了, 才能进行后续操作

    created() {
      // 建立连接的事件
      socket.on('connect', () => {
        console.log('与服务器建立了连接')
      })
    }
    

    5. 在组件销毁前, 关闭服务

    // 组件被销毁之前,清空 sock 对象
    beforeDestroy() {
      // 关闭连接
      socket.close()
    
      // 销毁 websocket 实例对象
      socket = null
    },
    

    6. 在created监听socket的消息

    created() {
        // ...
    
        // 接收到消息的事件
        socket.on('message', data => {
          // 把服务器发送过来的消息,存储到 list 数组中
          this.list.push({
            name: 'xs',
            msg: data.msg
          })
        })
    },
    

    7. 在 send事件中, 把服务器发来的数据装到数组里

    sendFn () {
        // 判断内容是否为空
        if (!this.word) return
    
        // 添加聊天消息到 list 列表中
        this.list.push({
            name: 'me',
            msg: this.word
        })
    }
    

    8. 客户端调用 socket.emit('message', 消息内容) 方法把消息发送给 websocket 服务器

    // 向服务端发送消息
    sendFn () {
        // 判断内容是否为空
        if (!this.word) return
    
        // 添加聊天消息到 list 列表中
        this.list.push({
            name: 'me',
            msg: this.word
        })
    
        // 把消息发送给 websocket 服务器
        socket.emit('message', {
            msg: this.word,
            timestamp: new Date().getTime()
        })
    
        // 清空文本框的内容
        this.word = ''
    }
    

    客服小思机器人

    <template>
      <div class="container">
        <!-- 固定导航 -->
        <van-nav-bar fixed left-arrow @click-left="$router.back()" title="小思同学"></van-nav-bar>
    
        <!-- 聊天主体区域 -->
        <div class="chat-list">
          <div v-for="(item, index) in list" :key="index">
            <!-- 左侧是机器人小思 -->
            <div class="chat-item left" v-if="item.name === 'xs'">
              <van-image fit="cover" round src="https://img.yzcdn.cn/vant/cat.jpeg" />
              <div class="chat-pao">{{ item.msg }}</div>
            </div>
    
            <!-- 右侧是当前用户 -->
            <div class="chat-item right" v-else>
              <div class="chat-pao">{{ item.msg }}</div>
              <van-image fit="cover" round :src="$store.state.photo" />
            </div>
          </div>
        </div>
    
        <!-- 对话区域 -->
        <div class="reply-container van-hairline--top">
          <van-field placeholder="说点什么..." v-model="word">
            <template #button>
              <span style="font-size:12px;color:#999" @click="sendFn">提交</span>
            </template>
          </van-field>
        </div>
      </div>
    </template>
    
    <script>
    import store from '@/store/index.js'
    import { io } from 'socket.io-client'
    export default {
      name: 'Chat',
      data() {
        return {
          word: '',
          socket: null,
          list: [
            // 只根据 name 属性,即可判断出这个消息应该渲染到左侧还是右侧
            { name: 'xs', msg: 'hi,你好!我是小思' },
            { name: 'me', msg: '我是编程小王子' }
          ]
        }
      },
      methods: {
        sendFn() {
          this.socket.emit('message', {
            msg: this.word,
            timestamp: Date.now()
          })
          this.list.push({ name: 'me', msg: this.word })
          this.word = ''
          // 聊天内容置底
          this.$nextTick(() => {
            const height1 = document.querySelector('.chat-list').clientHeight
            const height = document.querySelector('.chat-list').scrollHeight
            document.querySelector('.chat-list').scrollTop = height - height1
          })
        }
      },
      created() {
        this.socket = io('http://url地址', {
          query: {
            token: store.state.token
          },
          transports: ['websocket']
        })
        // 建立连接的事件
        this.socket.on('connect', () => {
          console.log('与服务器建立了连接')
        })
        this.socket.on('message', data => {
          // console.log(data)
          this.list.push({ name: 'xs', msg: data.msg })
          // 聊天内容置底
          this.$nextTick(() => {
            const height1 = document.querySelector('.chat-list').clientHeight
            const height = document.querySelector('.chat-list').scrollHeight
            document.querySelector('.chat-list').scrollTop = height - height1
          })
        })
      }
    }
    </script>
    
    <style lang="less" scoped>
    .container {
      height: 100%;
      width: 100%;
      position: absolute;
      left: 0;
      top: 0;
      box-sizing: border-box;
      background: #fafafa;
      padding: 46px 0 50px 0;
      .chat-list {
        height: 100%;
        overflow-y: scroll;
        .chat-item {
          padding: 10px;
          .van-image {
            vertical-align: top;
            width: 40px;
            height: 40px;
          }
          .chat-pao {
            vertical-align: top;
            display: inline-block;
            min-width: 40px;
            max-width: 70%;
            min-height: 40px;
            line-height: 38px;
            border: 0.5px solid #c2d9ea;
            border-radius: 4px;
            position: relative;
            padding: 0 10px;
            background-color: #e0effb;
            word-break: break-all;
            font-size: 14px;
            color: #333;
            &::before {
              content: '';
              width: 10px;
              height: 10px;
              position: absolute;
              top: 12px;
              border-top: 0.5px solid #c2d9ea;
              border-right: 0.5px solid #c2d9ea;
              background: #e0effb;
            }
          }
        }
      }
    }
    .chat-item.right {
      text-align: right;
      .chat-pao {
        margin-left: 0;
        margin-right: 15px;
        &::before {
          right: -6px;
          transform: rotate(45deg);
        }
      }
    }
    .chat-item.left {
      text-align: left;
      .chat-pao {
        margin-left: 15px;
        margin-right: 0;
        &::before {
          left: -5px;
          transform: rotate(-135deg);
        }
      }
    }
    .reply-container {
      position: fixed;
      left: 0;
      bottom: 0;
      height: 44px;
      width: 100%;
      background: #f5f5f5;
      z-index: 9999;
    }
    </style>
    text-align: left;
      .chat-pao {
        margin-left: 15px;
        margin-right: 0;
        &::before {
          left: -5px;
          transform: rotate(-135deg);
        }
      }
    }
    .reply-container {
      position: fixed;
      left: 0;
      bottom: 0;
      height: 44px;
      width: 100%;
      background: #f5f5f5;
      z-index: 9999;
    }
    </style>
    

    效果

    在这里插入图片描述

    展开全文
  • 因为HTML5定义了WebSocket协议,WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,简单来说能够达到客户端与服务端的双向,更多的介绍大家可以去网上搜搜,就不多说了,下面开始做一个.net...

    前言

    相信大家在做web项目的时候可能都会遇到某些信息弹窗,提醒之类的功能,最简单粗暴的方式就是轮询,比如每秒浏览器从服务器发起http请求,然后服务器返回最新的结果过来。所以这种一直循环方式有很大的缺陷,浪费带宽资源、被动、单向。因为HTML5定义了WebSocket协议,WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,简单来说能够达到客户端与服务端的双向,更多的介绍大家可以去网上搜搜,就不多说了,下面开始做一个.net的WebSocket的服务端。

    开始写服务端

    为了简单的实现我们的效果,这里我是建一个WinForm项目作为我们的服务端

    (一)新建一个.net framework4.5的WinForm项目

    在这里插入图片描述

    (二)选择一个适合自己的第三方websocket库

    打开万能的开源项目网站https://github.com选择下载一款自己喜欢的websocket开源库,这里我用的是WebSocket-Sharp(里面也有相关的使用说明文档),看个人喜好,至于每种库的好坏对比,就不评论了。
    在这里插入图片描述
    将https://github.com/sta/websocket-sharp下载下来,打开项目,生成编译,然后将生成的dll引用到我们项目里面来。在这里插入图片描述
    这里要特别说明下websocket-sharp的核心WebSocketBehavior,他包含了OnOpen,OnMessage,OnClose,OnError四个方法以及一个Sessions对象。熟悉websocket的都知道前四个方法是用来处理客户端链接、发送消息、链接关闭以及出错。sessions就是用来管理所有的回话连接。每产生一个连接,都会有一个新Id,sessions中会新增一个IWebSocketSession对象。当页面关闭或者刷新都会触发OnClose,继而sessions中会移除对应的IwebSocketSession对象。
    在这里插入图片描述

    (三)自定义新增一个继承WebSocketBehavior的处理类

    新增一个TestHandler类,继承WebSocketBehavior,TestHandler相当于是一个websocket的服务,你可以创建多个websocketBehavior的实例然后在挂载在websocketServer上。

        public class TestHandler : WebSocketBehavior
        {
            public Label lbUserCount;
            public TextBox showText;
            private Dictionary<string, string> nameList = new Dictionary<string, string>();
            protected override void OnOpen()
            {
                base.OnOpen();
                AppendValue("建立连接" + this.ID + "\r\n");
                nameList.Add(this.ID, "游客" + Sessions.Count);
                Broadcast(string.Format("{0}上线了,共有{1}人在线", nameList[this.ID], Sessions.Count), "3");
                ShowCount();
    
            }
            protected override void OnMessage(MessageEventArgs e)
            {
                base.OnMessage(e);
                string strMsg = e.Data;
                
                try
                {
                    var obj = JsonConvert.DeserializeObject<ReceiveMsg>(strMsg);
                    AppendValue("收到消息:" + obj.Message + " 类型:" + obj.MsgType + "id:" + this.ID + "\r\n");
                    switch (obj.MsgType)
                    {
                        //正常聊天
                        case "1":
                            obj.UserName = nameList[this.ID];
                            Sessions.Broadcast(JsonConvert.SerializeObject(obj));
                            break;
                        //修改名称
                        case "2":
                            AppendValue(string.Format("{0}修改名称{1} \r\n", nameList[this.ID], obj.Message));
                            Broadcast(string.Format("{0}修改名称{1}", nameList[this.ID], obj.Message), "3");
                            nameList[this.ID] = obj.Message;
                            break;
                        default:
                            Sessions.Broadcast(strMsg);
                            break;
    
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception);
                }
            }
            protected override void OnClose(CloseEventArgs e)
            {
                base.OnClose(e);
                AppendValue("连接关闭" + this.ID + "\r\n");
                Broadcast(string.Format("{0}下线,共有{1}人在线", nameList[this.ID], Sessions.Count), "3");
                nameList.Remove(this.ID);
                ShowCount();
            }
    
    
            /// <summary>
            /// 广播(群发)
            /// </summary>
            /// <param name="msg"></param>
            /// <param name="type"></param>
            private void Broadcast(string msg, string type = "1")
            {
                var data = new ReceiveMsg() { Message = msg, MsgType = type, UserName = nameList[this.ID] };
                Sessions.Broadcast(JsonConvert.SerializeObject(data));
            }
            /// <summary>
            /// 在线人数
            /// </summary>
            private void ShowCount()
            {
                //this.lbUserCount.Text = Sessions.Count.ToString();
                // 无返回值无参数用MethodInvoker委托,无返回值可有参数用Action委托,有返回值可有参数用Func委托
                lbUserCount.BeginInvoke(new Action<string>(msg => lbUserCount.Text = msg),
                    new object[] { Sessions.Count.ToString() });
            }
            public void AppendValue(string strValue)
            {
                // 无返回值无参数用MethodInvoker委托,无返回值可有参数用Action委托,有返回值可有参数用Func委托
                showText.BeginInvoke(new Action<string>(msg => showText.Text += msg+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
                    new object[] { strValue });
            }
    
    
        }
    

    From窗体代码

        public partial class Form1 : Form
        {
            private WebSocketServer wssv;
            private bool isStart = false;
            public Form1()
            {
                InitializeComponent();
                this.ShowListenStatus();
            }
            /// <summary>
            /// 启动
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    wssv = new WebSocketServer(Convert.ToInt32(textBox1.Text));
                    wssv.AddWebSocketService<TestHandler>("/Test/", p =>
                    {
                        p.lbUserCount = this.lbUserCount;
                        p.showText = this.showText;
                    });
                    wssv.Start();
                    isStart = true;
                    this.showText.Text += "连接成功!" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";
                    this.ShowListenStatus();
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message);
                }
            }
    
            /// <summary>
            /// 停止
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                wssv.Stop();
                isStart = false;
                this.lbUserCount.Text = "0";//重置为0
                this.showText.Text = "";//清空
                this.showText.Text += "连接断开!"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +"\r\n";
                
                ShowListenStatus();
            }
            private void ShowListenStatus()
            {
                this.button2.Enabled = isStart ? true : false;
                this.button1.Enabled = isStart ? false : true;
            }
        }
    

    运行测试效果
    在这里插入图片描述

    (四)写一个html5的聊天页面

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <script type="text/javascript" src="scripts/jquery.js"></script>
    <title>测试在线聊天</title>
    </head>
     
    <body>
     <div id="messages">
        </div>
    	   <div>昵称:<input type="text" id="nickName"  /> <button id="changebt">修改</button> 
       </div>
       <div>消息内容:<input type="text" id="content" value=""/>
       <button id="sendbt">发送</button>
       </div>
    </body>
    <script type="text/javascript">
        function initWS() {
            ws = new WebSocket("ws://localhost:9600/Test");
            ws.onopen = function (e) {
                console.log("Openened connection to websocket");
                console.log(e);
            };
    
            ws.onmessage = function (e) {
                console.log("收到",e.data)
                var div=$("<div>");
                var data=JSON.parse(e.data);
                switch(data.MsgType){
                    case "1":
                 div.html(data.UserName+":"+data.Message);
                break;
                    case "2":
                    div.addClass("gray");
                    div.html("修改名称"+data.Message)
                    break;
                    case "3":
                    div.addClass("gray");
                    div.html(data.Message)
                    break;
                }
                $("#messages").append(div);
            };
    		ws.onerror = function (msg) {
    
                    console.log("socket error!");
            };
        }
        
        initWS();
        function sendMsg(msg,type){
            ws.send(JSON.stringify({Message:msg,MsgType:type}));
        }
        $("#sendbt").click(function(){
           var text=$("#content").val();
           sendMsg(text,"1")
           $("#content").val("");
        })
        $("#changebt").click(function(){
            var text=$("#nickName").val();
            sendMsg(text,"2")
        })
    </script> 
    </html>
    

    测试截图
    在这里插入图片描述

    下面提供本项目相关的下载地址
    websocket-sharp.dll:https://download.csdn.net/download/shaojiayong/12903143
    项目完全源码(包含页面):https://download.csdn.net/download/shaojiayong/12903215

    展开全文
  • 一、websocket是由长链接和轮询进化而来,当建立连接之后,不断开连接,开闭一个数据传输通道数据格式为[]byte。后端会一直保留这个进程。 1.WebSocket 和 HTTP 实际上都是一个TCP链接。http请求可以通过设置header...
  • 作为.net开发,websocket又是使用的第三方平台,这个时候https绑定ssl会占用433端口,导致第三方平台websocket无法使用 最开始想,IIS使用80端口,websocket使用433,但是433被iis站点绑定的ht...
  • 数字货币交易所第三方行情数据接入,springboot项目可以改造微服务,接入到自己的项目中 软件架构 前端:vue+hqchart 后端:Springboot+netty+websocket 支持第三方行情:火币,ok 目录结构 前端项目:hqchart-...
  • 1、WebSocket 机制 以下简要介绍一下 WebSocket 的原理及运行机制。 WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 ...
  • 在B/S架构中,如果要实现消息推送功能,甚为困难。...对于推送来讲,它需要和服务器保持通信连接,服务器有新的数据则传送给客户端。当然还有前端基于Ajax轮询服务器拉取数据,这样的... 用户浏览新闻网站,当第三方新闻媒
  • c++ websocket服务器

    2019-12-29 11:44:35
    h5游戏中网络通信不在使用二进制协议,而是使用websocket(ws) 或者使用基于https的wss进行通信,但是已经自己实现过n次二进制协议通信了,所以也不想使用第三方库的实现。下面就介绍下如何使用c++自己实现一个ws...
  • https://v.qq.com/x/page/l0829f95kha.html
  • WebSocket

    2020-01-04 15:43:31
    Websocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API 中,浏览器和...
  • c++ WebSocket Secure服务器(wss服务器)

    千次阅读 2019-12-29 14:11:57
    做h5游戏,之前是自己写的epoll网络通信,所以开始项目的时候都没有多想就直接自己写了一个websocket网络,而不是使用第三方的ws库。一直用都没有出现问题,但是项目上线前一周前端对接sdk的时候说平台只支持https不...
  • websocket

    2019-03-22 10:09:00
    转自华哥 001、学习地址 ...//引入ws第三方模块 const WebSocket = require('ws'); //创建服务器 const server= new WebSocket.Server({ port: 9000 }); //定义一个数组将所有的用户存...
  • WebSocket 服务器3

    2016-10-19 17:30:00
    NodeJS本身并没有原生的WebSocket支持,但是有第三方的实现(大家要是有兴趣的话,完全可以参考WebSocket协议来做自己的实现),我们选择了“ws”作为我们的服务器端实现。由于本文的重点是讲解WebSocket,所以...
  • 为了在windows端实现一个Websocket服务供Web页面调用,且因为一些的原因需要使用MFC,翻阅了大量网络资料没有发现完全符合个人需要的内容,因此综合一些收集的资料做了一个简单的不依赖于第三方通信库的WebSocket供...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,724
精华内容 7,889
关键字:

websocket第三方服务