zoukankan      html  css  js  c++  java
  • 封装好的socket,拿去用

      年终有空咯,分享一下自己封装的socket类库. 由于公司写的socket代码非常醉人,我不能忍,所以自己封装了一下方便大家使用,现在有空也分享给园友用用看,现在还存在一定的问题,等下我列出来,希望大家能帮我出一些解决方案,完善这个东东.


      直接开讲,不废话了,一共3块,服务端,客户端,websocket

    一:服务端

    ServerListener listener = new ServerListener();

      1.构造函数:

        

      2.事件:

    //日志,内部的处理日志,主要用来看流程,实际用处不大.
    listener.Log += listener_Log;   //listener_Log(string msg)
    //客户端上线
    listener.ClientConnected += listener_ClientConnected;  //listener_ClientConnected(BaseClient t) 
    //客户端下线
    listener.ClientDisconnect += listener_ClientDisconnect;  //listener_ClientDisconnect(BaseClient t)
    //接收到完整消息
    listener.MsgRead += listener_MsgRead;   //listener_MsgRead(BaseClient t, byte[] t2) 

        说明:1.Log中msg参数是执行流程的消息,  2.t是当前客户端对象,  3.t2完整消息数据

      3.方法:

    //调用start启动监听;
    listener.Start();
    //停止监听
    listener.Stop();
    
    //广播消息,msg发送的内容,
    //type发送到客户端类型,传null发送到所有类型
    //(目前只有socket和websocket2个类型)
    listener.SendAll(byte[] msg, ClientType? type)
    
    //还有一个属性
    //在线客户端集合
    listener.Clients

    二:客户端

    Client client = new Client();

      1.构造函数:

        

      2.事件

    //日志
    client.Log += client_Log;  //client_Log(BaseClient t, string t2)
    //断开连接
    client.ClientDisconnect += client_ClientDisconnect;  //client_ClientDisconnect(BaseClient t)
    //连接服务器成功
    client.ClientConnected += client_ClientConnected;  //client_ClientConnected(BaseClient t,bool state,string msg)
    //发送完一条消息
    client.MsgSend += client_MsgSend;  //client_MsgSend(BaseClient t) 
    //接收到完整消息
    client.MsgRead += client_MsgRead;  //client_MsgRead(BaseClient t, byte[] t2)

      3.方法

    //启动连接服务器
    client.Start();
    //断开连接
    client.Stop();
    //发送数据
    client.SendData(byte[] data)

      4.属性

    /// <summary>
    /// 自动重连,默认false
    /// </summary>
    public bool AutoChonglian { get; set; }
    
    /// <summary>
    /// Id
    /// </summary>
    public Guid Id { get; set; }
    
    /// <summary>
    /// 远程网络地址
    /// </summary>
    public EndPoint RemoteIp{get;set;}
    
    /// <summary>
    /// 本地网络地址
    /// </summary>
    public EndPoint LocalIp{get;set;}
    
    /// <summary>
    /// 客户端类型
    /// </summary>
    public ClientType ClientType { get; private set; }
    
    /// <summary>
    /// 客户端对象是否为空
     /// </summary>
    public bool ClientIsNull{get;private set;}

    三:WebSocket

      websocket已经在服务端封装好了,直接连接就能通讯,这里唯一要讲一下的就是send的时候需要注意数据长度不能超过8184,超过分段发,还是给一段js出来 大家自己看把

    function addMsg(msg){
        $("#msg").append("<p>"+msg+"</p>");
    }
    
    
    var websocket  = new WebSocket("ws://ip:port/");
    websocket.onopen = function onOpen() {
        addMsg("已连接到服务器");
    };
     websocket.onclose = function onClose() {
        addMsg("服务器连接断开");
     };
      websocket.onerror = function onError() {
        addMsg("连接服务器失败");
    }
    websocket.onmessage = function onMessage(evt) {
        var data = evt.data;
        addMsg(data);
    };
    websocket.SendObj = function(obj) {
        return websocket.Send(obj + "⊙");
    };
    websocket.sendlen = 8184; //分段发送数据长度不能超过8184
    websocket.Send = function (msg) {
        if (websocket != null && websocket.readyState === websocket.OPEN) {
            if (msg.length > websocket.sendlen) {
                var sendcount = Math.ceil(msg.length / websocket.sendlen);
                for (var i = 0; i < sendcount; i++) {
                    var d = msg.substring(i * websocket.sendlen, websocket.sendlen * (i + 1));
                    websocket.send(d);
                }
            } else {
                websocket.send(msg);
            }
            return true;
        } else {
            addMsg("指令发送失败(与服务器断开连接)");
            return false;
        }
    };
    
    websocket.SendObj("发送数据,一般是json字符串,反正随便你");

    现在来说说还需要完整的地方

    1.文件传输还没有做.

    2.websocket 客户端发送大数据会有问题, 现在的情况  数据长度小于8184*5 不会有问题, 数据长度大于8184*10会频繁出现服务器接收数据异常问题,  这里求大神帮忙看看!!!

     还有个问题 循环发送大量数据也会出现问题比如 for 20次 sendobj("1")

     服务端发送大数据到客户端没有问题

    完事! 不介意骗点分吧 0.0

    dll下载地址:http://download.csdn.net/detail/fenglove123/9424665

  • 相关阅读:
    Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
    分布式架构2:Nginx下Session存储
    分布式架构3:MySQL集群(Mysql Cluster7.5.5)
    分布式架构1:Nginx实现负载均衡
    Oracle 触发器记录
    [Deprecation Notice] 本博客弃用, 迁移至新博客
    KM算法 O(n^3)最大权完美匹配
    Python 学习笔记(附 Pytorch)
    你一定看的懂的:vlan与交换机端口的三种模式access,trunk和hybrid
    Git代码回滚
  • 原文地址:https://www.cnblogs.com/jio92/p/jiosocket.html
Copyright © 2011-2022 走看看