Socket五(异步服务器实现)
目录
一 上一章回顾
二 同步概念
三 异步概念
四 服务器端异步实现
1 开启侦听
2 接收消息
3 发送消息
4 源码展示
5 异常提示
五 调用初始化
六 总结
七 下章预告
一 上一章回顾
一 上一章回顾
二 引入命名空间
三 定义套接字属性
四 定义初始化套接字方法
1 开启监听
2 发送消息
3 接受消息
五 关闭套接字
六 总结
七 下章预告
二 同步概念
同步是阻塞模式,当进程执行某个请求的时候,若该请求需要时间处理才能返回结果,那么这个进程将会阻塞停止,直到收到处理结果才继续执行下方逻辑;
同步是客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。在此期间客户端阻塞等待服务器返回结果,显示在UI上就是屏幕卡顿。
三 异步概念
异步是非阻塞模式,进程不会进阻塞,不管处理结果是否返回,而是直接执行下方业务逻辑。当处理有结果后,系统会通知进程进行处理,这样可以优先处理其他工作,有助于提高执行的效率。
异步就相当于当客户端发送给服务端请求时,在等待服务端响应的时候,客户端执行其他业务逻辑,这样节约了时间,提高了效率。
四 服务器端异步实现
首先,函数声明Async异步关键字,传入端口号。
1 开启侦听
- Using初始化服务器套接字,传入地址簇、套接字类型和通信协议类型。
- Bind IP端点。
- Listen客户端连接。
- AcceptAsync获取连接服务器句柄。
2 接收消息
- ReceiveAsync接受消息,并返回接受长度
- 将收到的字节数组转化为字符串
- 定义终止符
- 确认字符串终止,则控制台输出Socket server received message:XXX
3 发送消息
- 定义发送消息
- 将发送消息转化为字节数组
- SendAsync发送消息
- 控制台输出 Socket server sent acknowledgment:XXX
- 退出循环
4 源码展示
public async void InitSocket(int port)
{
using (ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
ServerSocket.Bind(new IPEndPoint(IPAddress.Any, port));
ServerSocket.Listen(10);
//异步接受客户端连接
var handler = await ServerSocket.AcceptAsync();
while (true)
{
//异步接受消息
var received = await handler.ReceiveAsync(buffer,0);
var response = Encoding.UTF8.GetString(buffer, 0, received);
var eom = "<|EOM|>";
if (response.IndexOf(eom) > -1 /* is end of message */)
{
Trace.WriteLine($"Socket server received message: "{response.Replace(eom, "")}"");
var ackMessage = "李工你好,我是你十年老粉!<|ACK|>";
var echoBytes = Encoding.UTF8.GetBytes(ackMessage);
await handler.SendAsync(echoBytes, 0);
Trace.WriteLine($"Socket server sent acknowledgment: "{ackMessage}"");
break;
}
else
Trace.WriteLine("消息不包含结束符号");
}
}
}
5 异常提示
如果收到的消息较大,控制台输出:“消息不包含结束符号!”
Trace.WriteLine("消息不包含结束符号");
五 调用初始化
首先初始化该套接字实力对象,其次调用初始化套接字方法,传入端口号
var server = new Server.ViewModels.ServerViewModel();
server.InitSocket(8080);
六 总结
以上我给大家介绍了同步概念、异步概念、服务器异步实现、调用初始化等内容,我们从中可以了解服务器套接字的工作原理。
七 下章预告
下一章我会教大家客户端套接字异步通信的工作原理。
博主RaymondLeigh:如果您觉得本文为您提供了结局思路或解决了您的实际问题,麻烦您🙏帮忙点赞、收藏、评论、关注一键四连,您的举手之劳将为我写作提供动力源泉!🤞
print('Hello,RaymondLeigh!') # 每日问候,跟大家问好!
🔥精品框架专栏:Prism专栏 WPF专栏
🌞精品前端UI设计专栏:MaterialDesign专栏
💾精品后端数据库专栏:SqlServer专栏 EFCore专栏 Socket专栏
💻精品程序开发专栏 VisualStudio专栏