目前客户端和服务端均是循环发送和接收命令,服务器先开启后,客户端输入命令,服务器再回传给客户端,现在遇到的问题是,在两端均循环发送和接收的同时,若关闭服务器端,出错,代码如下,帮忙分析下:
客户端发送数据的一个方法:
public void SendMessage(string msg) //发送数据到主机
{
try
{
tcpClient = new TcpClient();
tcpClient.Connect(new IPAddress(bytes), servetPort); //将客户端连接到主机
if (tcpClient.Connected)
{
flag = true;
}
if (flag)
{
// tcpClient = new TcpClient();
// tcpClient.Connect(new IPAddress(bytes), servetPort); //将客户端连接到主机
streamToServer = tcpClient.GetStream();
byte[] buffer = Encoding.Unicode.GetBytes(msg);
streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
}
}
catch (Exception)
{
try
{
streamToServer.Close();
tcpClient.Close();
}
catch (Exception)
{
// ignored
}
// ignored
}
}
接收数据的方法:
public string ReceiveMessage()
{
// byte[] buffer = streamToServer.ReadByte();
byte[] buffer = new byte[BufferSize];
int bytesRead = 0;
while (true)
{
try
{
if (flag)
{
Thread.Sleep(200);
lock (streamToServer)
{
bytesRead = streamToServer.Read(buffer, 0, buffer.Length);
}
}
}
catch (System.Net.Sockets.SocketException ex)
{
MessageBox.Show(ex.ToString());
// ignored
}
streamToServer.Close();
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
return msg;
}
------解决思路----------------------
很正常啊,这有什么不对吗
客户端正在发送或接收,对方断开了,还不报错,那不更有问题了
你catch里怎么只指定了一种错误类型?
至少还要再加个catch,捕捉其它错误类型,而不是有错误就直接挂 了
------解决思路----------------------
很正常,在catch里面处理
------解决思路----------------------
而且错误信息已经提示的很明显了
新错误是IOException,而不是SocketException
------解决思路----------------------
如果连对方断开了,程序都捕捉不到,还正常的发送接收,你才应该苦恼
------解决思路----------------------
不是已经提示的很明显了,是System.IO.IOException类型的异常
------解决思路----------------------
catch (System.IO.IOException ex1)
{
MessageBox.Show("服务器已关闭");
}
只声明类型,不声明变量,不会报错?
即使加了这个,你还应该在最后加上
catch(Exception ex)//捕获所有类型的异常
------解决思路----------------------
加上catch(Exception ex)也捕捉不到?
看下VS设置里,是否设置了断点在未捕捉的异常,还是设置了断点在所有异常
------解决思路----------------------
调试->异常->
看到底是否选择了"引发",还是只选择了"用户未处理的"
如果选择了引发,那么即使异常已经处理,那么依然会停在出错的代码行.
你在catch里设置断点,看出错之后,最终到底是否能走进catch里
------解决思路----------------------
你看,引发里一大堆挑
没动过不代表设置的没有问题
每个工程,这个选项都不一样的,并不是在VS里设置一次所有工程都跟着变
也许是你copy过来的这个工程,当初人家就是这么设置的
------解决思路----------------------
我这里有05,08,10,没安装12
你把引发的那些挑都去掉试试呗
或者像我说的,停了不要紧,看最终是否能走进catch里,还是按F5不往下走了
如果能往下走,不影响你最终发布执行的
------解决思路----------------------
还是把引发都关了吧
------解决思路----------------------
client.cs,行号157,try catch不到?
------解决思路----------------------
你客户端建立链接后似乎没有主动断开?