c# - 每当客户端将完整的对象发送到 C# 中的服务器时,如何获得通知?
问题描述
我正在寻找一种更好的方法来在 c# 中创建一个简单的服务器
我已经创建了一个并且工作正常,但是它消耗了大量的 cpu,我正在寻找一种更好的方法来优化它
我写了以下内容:
class server
{
Task[] Clients=new Task[5];
int counter=0;
public void open(IPAddress addr,int port){
TcpListener listener =new TcpListener(addr,port);
listener.Start();
while (true)
{
TcpClient client =listener.AcceptTcpClient();
Clients[counter] = new Task(()=>handle_client_connection(client));
Clients[counter].Start();
counter++;
}
}
public void handle_client_connection(TcpClient client){
System.Console.WriteLine("accpeted a new request");
NetworkStream stream=client.GetStream();
while(true){
if(stream.CanRead){
StreamReader reader =new StreamReader(stream);
string s=reader.ReadLine();
if(s != null){
System.Console.WriteLine("message recieved :"+s);
}
}
}
}
}
方法内部的while
循环handle_client_connecion()
是最困扰我的我想知道是否有办法知道客户端是否已将任何数据发送到网络流并在他这样做时得到通知
客户端不断序列化一个简单的对象并string
多次发送,我不知道客户端发送消息的时间,我不想陷入while循环并继续检查它是否为空缓冲区或不,我也担心如果我最终只阅读了客户的一半信息,请帮忙!
解决方案
推荐阅读
- c - C - memcpy with char * 长度大于源字符串长度
- sql - 如何创建从表中读取的动态视图?
- excel - 如何使用 Office JS API 在 Excel 中对行或列进行分组
- git - 您的分支领先于“origin/foobranch” N 次提交 - 什么提交?
- drake - 在 Ubuntu 18.04 上本地安装 Drake 的问题
- java - 如何从 WebSphere Portal 页面获取页面名称?
- ruby - 如何在 Ruby 中修复“未初始化的常量 List::Task (NameError)”
- python - 是否可以在不删除 NaN 值的情况下修复“ValueError:无法将浮点 NaN 转换为整数”错误?
- kotlin - Kotlin - 带有溢出异常的类型转换
- c - STM32:将地址映射存储在数组中