一个有关Tcplistener的问题

冰冷的小爪 2016-07-18 10:29:29
//我们一般是这样来接收一个客户端的
Tcplistener.BeginAcceptTcpClient(new AsyncCallback(AcceptClientCallBack), Tcplistener);
//
void AcceptClientCallBack(IAsyncResult iar)
{
try
{
TcpListener listener = (TcpListener)iar.AsyncState;
//获得客户端;
this.Tcpclient = new MyTcpClient(listener.EndAcceptTcpClient(iar));
//
}
catch(ObjectDisposedException){}
catch(Exception ex)
{}
}
//
问题来了,我在客户端没上线的时候,使用this.Tcplistener.Stop(); this.Tcplistener.Server.Dispose(); 来结束网络端口的监听, 就会导致AcceptClientCallBack中,产生ObjectDisposedException,这是我不想见到的,有什么办法避免这个异常????
...全文
153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个地方就需要 try...catch。 产生异常是明明客户端在连接,但是你的服务器端没有应答、反而是关闭了服务器。根本不是你说的那个原因。 但是这个 try...catch 还是需要写的。 你的代码的逻辑结构有个比较大的问题
void AcceptClientCallBack(IAsyncResult iar)
        {
            try
            {
                TcpListener listener = (TcpListener)iar.AsyncState;
                //获得客户端;
                this.Tcpclient = new MyTcpClient(listener.EndAcceptTcpClient(iar));
            }
             catch(Exception ex)
             {
                   this.Tcpclient = null;
                   return;
             }

            // 这里是主要内容

}
你的代码的主要工作内容,应该在 catch 之后,而不是在try 之内。这里的 try....catch 应该准确地就是为了 listener.EndAcceptTcpClient(iar) 这一个东西而设计的。实际上 try 包含了你的 new MyTcpClient(...) 这样一个语句,都有一点范围扩大了。不过假设你这个对象实例化也没有做什么容易发生问题的事情,暂且可以这样写。 也就是说,try...catch 不要随便扩大。
冰冷的小爪 2016-07-18
  • 打赏
  • 举报
回复
引用 1 楼 diaodiaop 的回复:
所谓的"监听" 就是一直开启端口... 为什么你要stop呢.. 就好比 有一个网站 是80端口 不管你访问还是不访问 那个端口依然存在并且打开的..
不会吗?这里就有个异常:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 那我应该怎样释放这个Tcplistener对象,又不会产生上述异常???
by_封爱 版主 2016-07-18
  • 打赏
  • 举报
回复
所谓的"监听" 就是一直开启端口... 为什么你要stop呢.. 就好比 有一个网站 是80端口 不管你访问还是不访问 那个端口依然存在并且打开的..
冰冷的小爪 2016-07-18
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
void AcceptClientCallBack(IAsyncResult iar)
        {
            TcpClient client = null;
            try
            {
                TcpListener listener = (TcpListener)iar.AsyncState;
                client = listener.EndAcceptTcpClient(iar);
            }
             catch(Exception ex)
             {
                   this.Tcpclient = null;
                   return;
             }
  
            this.Tcpclient = new MyTcpClient(client);
           //........................继续进行处理
}
好的,谢谢您,看来我水平还差点。。。。 不过,请问一下“因为你任意夸大了 try...catch 的适用范围,上纲上线,因此触碰了基本的原则。“类似这种写代码的原则,怎样才能学习到?我想提高写代码的质量
  • 打赏
  • 举报
回复
void AcceptClientCallBack(IAsyncResult iar)
        {
            TcpClient client = null;
            try
            {
                TcpListener listener = (TcpListener)iar.AsyncState;
                client = listener.EndAcceptTcpClient(iar);
            }
             catch(Exception ex)
             {
                   this.Tcpclient = null;
                   return;
             }
  
            this.Tcpclient = new MyTcpClient(client);
           //........................继续进行处理
}
  • 打赏
  • 举报
回复
如果要比较准确地表达这里的逻辑,应该这样写
void AcceptClientCallBack(IAsyncResult iar)
        {
            TcpClient client = null;
            try
            {
                TcpListener listener = (TcpListener)iar.AsyncState;
                client = listener.EndAcceptTcpClient(iar);
            }
             catch(Exception ex)
             {
                   this.Tcpclient = null;
                   return;
             }
 
            this.Tcpclient = new MyTcpClient(client);
 
}
这样就能明白地说明你的逻辑了,别人也就不会误解你使用 try,,,catch 的本意了。 之所以误解,就是因为你任意夸大了 try...catch 的适用范围,上纲上线,因此触碰了基本的原则。

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧