Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

这篇具有很好参考价值的文章主要介绍了Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#服务端用到Fleck包,它包含哪些可用的回调函数,有哪些常用的api方法?

演示:服务端收到Unity用户发来的信息
Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

1、Fleck服务器提供哪些回调函数

Fleck提供的回调函数有下面几种:

//用户连入服务器时...
Action OnOpen { get; set; }

//用户与服务器断开连接时...
Action OnClose { get; set; }

//收到字符串消息时...
Action<string> OnMessage { get; set; }

//收到二进制数据时...
Action<byte[]> OnBinary { get; set; }

//收到别人发来的ping信息时...
Action<byte[]> OnPing { get; set; }

//收到别人发来的pong信息时...
Action<byte[]> OnPong { get; set; }

//出错的时候调用...[?谁出错,服务器出错还是连接出错,出的是什么错?]
Action<Exception> OnError { get; set; }

2 、服务器提供的其它API

其它常用的api主要有:

//发送字符串
Task Send(string message);

//发送字节码(二进制数据)
// 1Byte = 8 bits
// 1KB = 1024 Bytes
// 1MB = 1024KB
Task Send(byte[] message);

//发送一个ping信息
Task SendPing(byte[] message);

//发送一个pong信息
Task SendPong(byte[] message);

//关闭连接
void Close();

//关闭连接?关闭连接池中指定序号的连接?
void Close(int code);
  • ping pong的作用是啥?
    WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。
    发送方->接收方:ping;
    接收方->发送方:pong;

C# 在WinForm里使用Fleck作为服务器的简单示例代码:

 private void button1_Click(object sender, EventArgs e)
{
    if (hasStartedServer)//不重复启动服务器实例
        return;

    var server = new WebSocketServer("ws://192.168.0.137:8081");  //ws://localhost:8081    ws://127.0.0.0:8181
    server.Start(socket =>
    {
        //连上时...
        socket.OnOpen = () =>
        {
            Debug.WriteLine($"有新用户连入:{socket.ConnectionInfo.ClientIpAddress}");
        };

        //断开时...
        socket.OnClose = () =>
        {
            Debug.WriteLine($"用户断开连接:{socket.ConnectionInfo.ClientIpAddress}");
            UserSockets.First(x => x.socket.ConnectionInfo.Id == socket.ConnectionInfo.Id).connected = false;
        };

        //收到string信息时...
        socket.OnMessage = message =>
        {
            socket.Send($"服务器收到消息 : {DateTime.Now.ToString()}");
            Debug.WriteLine($"收到一条消息,来自:{socket.ConnectionInfo.ClientIpAddress}");
            Debug.WriteLine(message);

            var cmd  = message.Split("#")[0];
            if (cmd == "name")
            {
                var userID = message.Split("#")[1];
                Debug.WriteLine($"收到一条消息,来自用户:{userID}  连接id:{socket.ConnectionInfo.Id}");

                UserSocket user = new UserSocket(){userID = userID,socket = socket,connected = true};
                UserSockets.Add(user);
            }
        };

        //收到二进制信息时...
        socket.OnBinary = bytes =>
        {
            var userName = UserSockets.First(x => x.socket.ConnectionInfo.Id == socket.ConnectionInfo.Id)
                .userID;
            Debug.WriteLine($"收到二进制数据,长度为{bytes.Length}Bytes,来自ip:{socket.ConnectionInfo.ClientIpAddress},userID ={userName}");
        };
    });

    Debug.WriteLine("服务器已经启动!");
    hasStartedServer = true;
}

3、服务器与客户端建立的连接包含哪些信息

  public interface IWebSocketConnectionInfo
  {
    string SubProtocol { get; }

    string Origin { get; }

    string Host { get; }

    string Path { get; }

    string ClientIpAddress { get; }

    int ClientPort { get; }

    IDictionary<string, string> Cookies { get; }

    IDictionary<string, string> Headers { get; }

    Guid Id { get; }

    string NegotiatedSubProtocol { get; }
  }

每次建立的连接,Id号是唯一的。

4、服务器接收数据时是否会粘包?

经测试,同一连接连续向服务器发送数据时,每次OnBinary收到的消息是完整的。
还没瞻仰源码,后面有空看看,server端TCP接收数据时,应该是做了包的合并处理,接到一个整坨数据,才调用的OnBinary。
Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

  • Unity用户端代码
    连发50笔数据,每次发送1M bytes
 int i = 0;
 while (i < 50)  //连发50笔数据,每次发送1M bytes
 {
     var bytesArray = new byte[1048576];  // 1024 * 1024 = 1048576
     await websocket.Send(bytesArray);    //或者直接await,测试结果一样
     Debug.Log($"发送数据-{i}");
     i++;
 }
  • C#服务端代码
    每当收到数据时,把收到的数据长度打印出来
socket.OnBinary = bytes =>
   {
        Debug.WriteLine($"收到二进制数据,长度为{bytes.Length}Bytes,来自{socket.ConnectionInfo.ClientIpAddress}");
   };

5、同一个ip上有两个应用同时发来信息,如何区分这些连接属于哪个用户?

简要思路:每个用户端启动的时候,需要用户名登录,建立连接时,告诉服务器这个socket是哪个userID的,凡是该用户建立连接,后台都把该连接绑定到user ID。

  • 1、每次建立连接,connection的id是唯一的
    Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

  • 2、服务器端维护一个【连接列表】:(string userID - > webSocket sockt),如下所示:

public class UserSocket
{
    /// <summary>
    /// 用户ID
    /// </summary>
    public string userID;

    /// <summary>
    /// socket对象
    /// </summary>
    public IWebSocketConnection socket;

    /// <summary>
    /// 状态:true-可用状态  false-断开状态
    /// </summary>
    public bool connected;
}
userID socket connected
guest socket1 true
user1 socket2 true
user2 socket3 false
userN socketM true

客户端建立连接的时候,发送信息给服务器,告诉服务器该连接对应那个用户名。
服务器收到信息后,及时更新【连接列表】。

  • 用户端在建立连接的时候,发送一个string命令,告诉服务器这个连接后面是哪个用户(user ID)
websocket.OnOpen += () =>
{
    Debug.Log("连接成功!!");   
    websocket.SendText($"name#user001"); //发送用户id
};
  • 服务器收到信息的处理
 //收到二进制信息
socket.OnBinary = bytes =>
{
    var userName = UserSockets.First(x => x.socket.ConnectionInfo.Id == socket.ConnectionInfo.Id)
        .userID;
    Debug.WriteLine($"收到二进制数据,长度为{bytes.Length}Bytes,来自ip:{socket.ConnectionInfo.ClientIpAddress},userID ={userName}");
};

收到信息,且识别了是哪个userID发来的
Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

6、本文测试环境

Win10 + Unity2021.3.18 + VS2019(.NET 5.0)文章来源地址https://www.toymoban.com/news/detail-482279.html

到了这里,关于Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#知识点-13(进程、多线程、使用Socket实现服务器与客户端通信)

    进程 定义:每一个正在运行的应用程序,都是一个进程  进程不等于正在运行的应用程序。而是为应用程序的运行构建一个运行环境 多线程 这段代码在执行完成之前,程序会被卡死(不能操作程序,包括关闭窗口)。因为我们程序在做一些耗时操作的时候,如果主线程去执

    2024年02月22日
    浏览(93)
  • JavaWeb-WebSocket浏览器服务器双向通信

    WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器 全双工通信 —浏览器和服务器只需要完成一次握手,两者之间就可以创建 持久性 的连接,并进行双向数据传输。 HTTP传输 WebSocket传输 HTTP协议和WebSocket协议的对比: HTTP是短连接,WebSocket是长连接 HTTP通信是单向

    2024年01月21日
    浏览(48)
  • python模块websockets,浏览器与服务器之间的双向通信

    一、简介 WebSocket是一种在Web浏览器和服务器之间进行实时双向通信的协议。它通过建立一条持久的连接,允许服务器主动向客户端推送数据,实现实时性和双向通信的能力。 与传统的HTTP请求-响应模式不同,WebSocket提供了一个长时间运行的连接,可以在客户端和服务器之间进

    2024年02月21日
    浏览(44)
  • C#与西门子PLC1500的ModbusTcp服务器通信3--搭建ModbusTcp服务器

     注意,这个IP地址必须与西门子虚拟网卡的IP地址及虚拟机的网卡IP地址同一网段           找到程序块main,找到右边的指令,找到通信,找到其它,拖到MB_SERVER到程序段1中    重点看mb_hold_reg和connect参数,disconnet为false表示被动连接,意思是说服务器等待客户机来连接,而

    2024年02月11日
    浏览(47)
  • OPC通信从入门到精通_2_OPC通信详解和C#客户端编程(OPC基础概念;OPC通信仿真(KepServer作为OPC服务器;使用Modbus Slave和另外软件仿真2个PLC设备);C#程序)

    OPC诞生缘由:OPC诞生之前,软件工程师是不了解硬件和协议的 OPC解决的是软件和硬件之间的问题,让软件工程师无需了解协议及底层硬件,例如串口协议等 OPC起到了桥梁的作用:软件工程师对接OPC,OPC对接硬件 OPC是一种通讯方式,落到实处就是一个软件,就需要开发相应的

    2024年02月05日
    浏览(75)
  • C#与西门子PLC1500的ModbusTcp服务器通信1--项目背景

    最近在一个120万元的项目中,涉及到modbustcp通信,我作为软件总工负责项目的通信程序开发,modbus是一个在工业自动化领域中的通信协议,可以是modbusrtu,modbusascii,modbustcp三个形式,具体来说是三个不同的数据包结构,具体的细节请读者自行熟悉,这里只讲项目中应用过程

    2024年02月12日
    浏览(51)
  • Unity-UDP-客户端/服务器通信功能

    这里简单实现客户端和服务器,复杂的实现需要和前几篇文章的TCP一样,管理多个链接过来的客户端,这里只有一个。需要自己封装类似listener来管理多个链接过来的设备,每次都缓存ReceiveAsync收到消息的中的RemoteEndPoint地址端口,统一管理发送接收消息。 https://zhidao.baidu.c

    2024年02月11日
    浏览(66)
  • C#与西门子PLC1500的ModbusTcp服务器通信2--ModbusTcp协议

    Modbus TCP是近年来越来越流行的工业控制系统通信协议之一,与其他通信协议相比,Modbus TCP通信速度快、可靠性高、兼容性强、适用于模拟或数字量信号的传输,阅读本文前你必须比较熟悉Modbus协议,了解tcp网络。 Modbus TCP是一种以太网协议,它将Modbus通信协议封装在TCP/IP包内

    2024年02月11日
    浏览(46)
  • C# Socket通信从入门到精通(16)——单个同步UDP服务器监听多个客户端C#代码实现

    我们在开发UDP通信程序时,有时候我们也需要开发UDP服务器程序,这个服务器只需要和一个客户端实现通信,比如这篇博文C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现,但是在实际项目中有的时候需要和多个客户端进行通信,这时和一个客

    2024年01月22日
    浏览(64)
  • C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现

    我们在开发UDP通信程序时,除了开发UDP客户端程序,有时候我们也需要开发UDP服务器程序,这在实际项目中是经常会遇到的,所以说掌握UDP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握UDP服务器程序的开发是走向高级工程师的必经之路,也是面试必

    2024年02月03日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包