C# Socket 异步通讯
研究了好几天的socket还是不太明白,如果像我这么写服务器端,同时1000访问会出现什么问题?怎么样的处理方式会比较好呢...
研究了好几天的socket还是不太明白,
如果像我这么写服务器端,同时1000访问会出现什么问题?怎么样的处理方式会比较好呢 展开
如果像我这么写服务器端,同时1000访问会出现什么问题?怎么样的处理方式会比较好呢 展开
2个回答
展开全部
这样写异步处理方法没错,异步处理TCP连接就是这样写的!
在异步RecVing方法中有两点可以改进:
1)增加异常处理,目的是:即使发生异常也保证Socket能正常工作。
2)调用 EndAceept返回的是正在与客户端连接的sockt
private static void RecVing(IAsyncResult Result)
{
//通过 result 获取socket。在这个socket上你启动了BeginAccept操作
Socket socket = Result.AsyncState as Socket;
Socket Res_soc = null; //这个是与当前客户端连接的Socket
Socket_Business business = new Socket_Business();
try
{
// 通过EndAccept,获取与当前客户端连接的Socket
Res_soc = socket.EndAccept(Result);
Console.WriteLine("连接成功!");
byte[] bytes =new byte[80];
int i = Res_soc.Receive(bytes);
string cmdstr = System.Encoding.Default.GetString(bytes, 0, i);
Console.WriteLine(cmdstr);
business.Business(bytes, Res_soc);
send(Res_soc);
}
catch
{
// 发生异常时,释放Res_soc
if(Res_soc != null) Res_soc = null;
}
finally //利用finally 确保无论发生什么异常都能够让socket继续接收连接
{
//继续异步等待连接
socket.BeginAccept(new AsyncCallback(RecVing), socket);
}
}
另外:楼上“许惘然”的说法是不对的。因为Res_soc是定义在RecVing中的个局部变量,当从RecVing中退出后,这个被变量自动释放掉了。
更多追问追答
追问
1、在性能方面有什么需要改进的地方吗?楼上那个说的资源耗尽怎么处理呢?
2、这样写的方式与多线程哪种方式会好点呢
追答
楼上“许惘然”的说法是不对的。因为Res_soc是定义在RecVing中的个局部变量,当从RecVing中退出后,这个Res_soc被自动释放掉了。
性能上没有什么可改的。这样的写法正是微软所推荐的。我曾经按这样的写法,对付过超过20000个TCP链接(阵发性链接:链接——交换数据——断开链接);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询