我在说socket异步通讯时,作个一个类自己用,但在使用的时候发现一下的问题,请教各位了:
这个时客户端连接方法:方法在beginConnect后回调Connected方法
public virtual void Connect(string ip, int port)
{ Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
try
{
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
} }
在Connected方法中实现如下:
protected virtual void Connected(IAsyncResult iar)
{ Socket socket = (Socket)iar.AsyncState;
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
//创建新的会话
_session = new Session(socket);
_isConnected = true;
//触发连接建立事件
if (ConnectedServer != null)
{
ConnectedServer(this, new NetEventArgs(_session));
}
//建立连接后应该立即接收数据
_session.ClientSocket.BeginReceive(_recvDataBuffer, 0,
DefaultBufferSize, SocketFlags.None,
new AsyncCallback(RecvData), socket);
}
在socket.EndConnect(iar)处捕捉异常,也就是如果连不上服务器的话,这个地方抛出异常。
应用程序中:
try
{
m_TcpCli.Connect(m_strServerIp, m_iPortNum);
}
catch(Exception exx)
{
MessageBox.Show(exx.Message);
return;
}
但在程序运行过程中,不启动服务器而启动客户机连接,并没有捕获到那个socket.EndConnect(iar)处抛出的异常,平且显示如图:这是为什么,向大家学习学习。谢谢啦
这个时客户端连接方法:方法在beginConnect后回调Connected方法
public virtual void Connect(string ip, int port)
{ Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
try
{
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
} }
在Connected方法中实现如下:
protected virtual void Connected(IAsyncResult iar)
{ Socket socket = (Socket)iar.AsyncState;
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
//创建新的会话
_session = new Session(socket);
_isConnected = true;
//触发连接建立事件
if (ConnectedServer != null)
{
ConnectedServer(this, new NetEventArgs(_session));
}
//建立连接后应该立即接收数据
_session.ClientSocket.BeginReceive(_recvDataBuffer, 0,
DefaultBufferSize, SocketFlags.None,
new AsyncCallback(RecvData), socket);
}
在socket.EndConnect(iar)处捕捉异常,也就是如果连不上服务器的话,这个地方抛出异常。
应用程序中:
try
{
m_TcpCli.Connect(m_strServerIp, m_iPortNum);
}
catch(Exception exx)
{
MessageBox.Show(exx.Message);
return;
}
但在程序运行过程中,不启动服务器而启动客户机连接,并没有捕获到那个socket.EndConnect(iar)处抛出的异常,平且显示如图:这是为什么,向大家学习学习。谢谢啦
解决方案 »
- 设置PrimaryKey属性与数据库设置主键有什么区别?
- dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
- vs.net 2003和2005差距
- Infragistics NetAdvantage 2005 Vol 1 如何获取当前行
- winform中,怎样把一个文件一行一行的读出来?
- 有高手做过用C#访问InSQL实时数据库的么.
- 有人做过多显卡操作的程序吗
- 高分了懂delphi大家去看看我的问题把
- 想知道谁对mshtml进行过比较彻底的研究 请教则个
- 如何判断一个类是另一个类的子类?
- 新手,请教大家一个问题!
- 为什么vs中新建一个项目,会有两个编写代码的窗口?
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
处报错,显示“为处理ApplicationException”
try
{
//这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
}
这报错。怎么才能捕获这个异常呢?
try
{
//如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
xxx.EndMethod(param);
}
catch (Exception ex)
{
//thorw your Exception
....
}
在End方法捕获就行。
异步的概念就是调用的方法并不会阻塞当前线程,如果它阻塞了,那也不是异步了。
你可以在调用endConnect的方法中捕捉再抛出这个错误。
或者
可以定义一个ConnectError事件,在出现错误时,引发此事件。