【mini-asio】 轻量级夸平台底层客户端网络解决方案

最好能给出 在项目中使用的示例

对啊,最好是多点example,一般的网络库都有些基础功能的example的,比如echo,chat等,包括服务端和客户端,这样使用的人才更容易直接用在项目中,现在还是不太容易把这个库直接接入项目里。
话说你整合到你们项目的时候客户端和服务器都用的这个库吗?

没,我只集成到客户端,我们服务器是java, 并发服务器不建议使用本库

yasio-3.21.0

  1. 修复start_service/stop_service不能多次调用
  2. 增加YASIO_NI接口, 以便进行跨语言交互,例如C#, Unity.
  3. 修复lua5.2, lua5.3 C++11 编译问题
  4. transport使用对象池分配,返回句柄对YASIO_NI更安全
  5. 修改脚本API: ibstream.read_v, obstream.write_v默认使用变长长度域,和C# BinaryWriter, BinaryReader兼容
    6.移除脚本API: ibstream.read_string, obstream.write_string, 兼容方式: write_v/read_v, 具体见wiki
  6. YASIO_NI API: yasio_set_resolv_fn设置自定义域名解析, 例如httpdns

https://github.com/halx99/yasio/releases/tag/v3.21.0

大佬,请问yasio_kcp有做吗?
或者能否指教一下怎么结合使用,谢谢了

尝试搞了下,可以参考一下: https://github.com/halx99/yasio/tree/experimental/yasio/experimental

看了下,完全看不懂,我太菜了……
是不是把yasio替换成yasio_kcp就可以了?

对,你和原版yasio.cpp, yasio.h对比一下,差异不是很大
使用,都用UDP就行,详娟
yasio_kcp_test.cpp

好的,谢谢大佬:pray:

再请教一下,我连任何ip和端口都会显示连接成功,是我的使用方法有问题吗?
附上代码:

this.yclient = new yasio.io_service();
        this.tsport_c = null;
        this.yclient.set_option(yasio.YOPT_LFBFD_PARAMS, 65535, 1, 2, 1);
        this.yclient.start_service({ host: '192.168.0.11', port: 8888 }, (event) => {
            let kind = event.kind();
            if (kind === yasio.YEK_CONNECT_RESPONSE) {
                fun.log('net', 'yasio event --> connect server succeed, kind = ', event.kind(), 'status = ', event.status());
                this.tsport_c = event.transport();
                this._connected = true; 
                fun.event.emit("WebsocketOpen", { state: "connected" });
            } else if (kind === yasio.YEK_PACKET) {
                fun.log('net', 'yasio client--> recive a packet from server, kind = %d, close connect after 3 seconds', event.kind());
                this.onmessage(event);
            } else if (kind === yasio.YEK_CONNECTION_LOST) {
                fun.log('net', 'yasio client--> connect lost kind = %d', event.kind());
            } else {
                fun.log('net', 'yasio client --> other kind = ', event.kind());
            }
        });
        this.yclient.open(0, yasio.YCM_UDP_CLIENT);
        this.yclientID = yasio.setInterval(() => {
            this.yclient.dispatch_events(128);
        }, 0.01);

日志:

05-23 14:03:13.498 19603-20076/games.xx.xxI/yasio: [yasio][1558591393498578] [index: 0] connecting server 192.168.0.11:8888...
05-23 14:03:13.502 19603-20076/games.xx.xxI/yasio: [yasio][1558591393501944] [index: 0] the connection #1 [192.168.1.111:43731] --> [192.168.0.11:8888] is established.
05-23 14:03:13.973 19603-19691/games.xx.xxD/jswrapper: JS: 【net】 "yasio event --> connect server succeed, kind = ",0,"status = ",0," time:1558591393973"

服务端使用的kcp-go不知道有影响没?

找到原因了,kcp-go里添加了前向纠错,关掉就好了。

只是现在向服务端发送hello,服务端收到完整数据,回传给客户端的收到的却是ello

set_option(yasio.YOPT_LFBFD_PARAMS, 65535, 0, 0, 0);
或者
set_option(yasio.YOPT_LFBFD_PARAMS, 65535, -1, 0, 0);

通过node-kcp验证服务端没问题,请问是我的设置不对吗?

udp只是建立映射,没有连接概念,所以是立即返回成功的

注意: 选项必须是, 对于无长度字段设计的消息通讯,必须设为:

set_option(yasio.YOPT_LFBFD_PARAMS, 65535, -1, 0, 0)

否则,按照具体的协议设置

怪我没表述清楚
最开始的设置就是set_option(yasio.YOPT_LFBFD_PARAMS, 65535, -1, 0, 0)
收到的回复是ello

我在js_yasio_io_event_packet中打印packet的值是hello说明网络收发是正常的
但是在js_yasio_ibstream_read_v中打印sv的值就是ello加一些乱码了……

改为发送arraybuffer,接收时用event.packet(true)就正常了……

对,对于非TV或TLV数据,不能用ibstream的read_xx, 直接用这个 event.packet(true)

1赞

好的,谢谢大佬

再请教一下:

使用注释的设置时,我们在良好的wifi环境下,普通消息收发要1秒,有的消息甚至长达9秒
而使用注释下面那行的设置时则只需要100ms左右,请问为啥interval要设置那么大呢?

设置100ms会比较耗费CPU,另外,我这里只是试验性地实现,可能没完全理解kcp作者的API调用方式,对于已经存在异步阻塞模型的场景,kcp作者没有具体的示例。设置100ms基本上等同于轮循