C# Socket 异步通讯

研究了好几天的socket还是不太明白,如果像我这么写服务器端,同时1000访问会出现什么问题?怎么样的处理方式会比较好呢... 研究了好几天的socket还是不太明白,
如果像我这么写服务器端,同时1000访问会出现什么问题?怎么样的处理方式会比较好呢
展开
 我来答
freeeeeewind
2014-03-29 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1356万
展开全部

这样写异步处理方法没错,异步处理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链接(阵发性链接:链接——交换数据——断开链接);
时针楼
2014-03-29 · 采风人文,以观当世。幽发己见
时针楼
采纳数:81 获赞数:235

向TA提问 私信TA
展开全部
你这样会造成资源耗尽的,你接受了socket却没有释放
追问

可以说详细点么   怎么样释放呢?释放socket不是关闭socket吗?释放了怎么在接收下次客户端发来的数据包呢?

我做了个客户端测试,不知道这样测试能不能测出来

接收5w次没有问题

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式