阿里巴巴网站建设规划,it运维职业规划,网站制作的语言,企业需要缴纳哪些税C#服务端用到Fleck包#xff0c;它包含哪些可用的回调函数#xff0c;有哪些常用的api方法#xff1f;
演示#xff1a;服务端收到Unity用户发来的信息
1、Fleck服务器提供哪些回调函数
Fleck提供的回调函数有下面几种#xff1a;
//用户连入服务器时...
Action OnOp…C#服务端用到Fleck包它包含哪些可用的回调函数有哪些常用的api方法
演示服务端收到Unity用户发来的信息
1、Fleck服务器提供哪些回调函数
Fleck提供的回调函数有下面几种
//用户连入服务器时...
Action OnOpen { get; set; }//用户与服务器断开连接时...
Action OnClose { get; set; }//收到字符串消息时...
Actionstring OnMessage { get; set; }//收到二进制数据时...
Actionbyte[] OnBinary { get; set; }//收到别人发来的ping信息时...
Actionbyte[] OnPing { get; set; }//收到别人发来的pong信息时...
Actionbyte[] OnPong { get; set; }//出错的时候调用...[?谁出错服务器出错还是连接出错出的是什么错]
ActionException 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:8181server.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; }IDictionarystring, string Cookies { get; }IDictionarystring, string Headers { get; }Guid Id { get; }string NegotiatedSubProtocol { get; }}每次建立的连接Id号是唯一的。
4、服务器接收数据时是否会粘包
经测试同一连接连续向服务器发送数据时每次OnBinary收到的消息是完整的。 还没瞻仰源码后面有空看看server端TCP接收数据时应该是做了包的合并处理接到一个整坨数据才调用的OnBinary。 Unity用户端代码 连发50笔数据每次发送1M bytes int i 0;while (i 50) //连发50笔数据每次发送1M bytes{var bytesArray new byte[1048576]; // 1024 * 1024 1048576await 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是唯一的 2、服务器端维护一个【连接列表】string userID - webSocket sockt如下所示
public class UserSocket
{/// summary/// 用户ID/// /summarypublic string userID;/// summary/// socket对象/// /summarypublic IWebSocketConnection socket;/// summary/// 状态true-可用状态 false-断开状态/// /summarypublic bool connected;
}userIDsocketconnectedguestsocket1trueuser1socket2trueuser2socket3false………userNsocketMtrue
客户端建立连接的时候发送信息给服务器告诉服务器该连接对应那个用户名。 服务器收到信息后及时更新【连接列表】。
用户端在建立连接的时候发送一个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发来的
6、本文测试环境
Win10 Unity2021.3.18 VS2019(.NET 5.0)