您好,感谢您的帮助。 这次我想问一下TcpClient。 我有一个服务器程序,我正在编写一个客户端程序。 此客户端使用TcpClient。首先是创建一个新客户端
clientSocket=new TcpClient();
(顺便说一下,这会导致异常吗?以防我把它放在try-catch中,但我不确定是否真的有必要) 无论如何,后来我进入一个循环,在这个循环内我连接到服务器
clientSocket.Connect("xx.xx.xx.xx",port);
然后我用
创建一个NetworkStreamclientStream=clientSocket.GetStream();
然后通过Read开始等待来自服务器的数据。我知道这是阻塞所以我也设置了ReadTimeOut(比如1秒)
无论如何,到目前为止一切顺利。 如果我没有从服务器收到任何东西,我会尝试向它发送一些东西。如果这种情况持续发生3次,我想要关闭连接并再次重新连接到服务器
(注意一个完全不同的问题是当服务器以某种方式关闭时,导致客户端中的其他类型的错误 - 或许我稍后会问这个问题)
那么,我该怎么办?
if(clientSocket.Connected)
{
Console.WriteLine("Closing the socket");
clientSocket.Close();
}
我关闭了套接字。 循环结束,所以我再次开始尝试连接到服务器。
clientSocket.Connect("xx.xx.xx.xx",port);
然而,这会导致错误(实际上是未处理的异常)“无法访问已处置的对象”
所以我的问题是 如何关闭并重新连接到服务器?
再次感谢您的帮助
答案 0 :(得分:3)
TcpClient
实例只能用于连接一次。你可以简单地实例化一个新的TcpClient
,而不是试图重新打开一个封闭的。{/ p>
答案 1 :(得分:3)
如the other answer中所述,TcpClient
对象只能连接一次。如果要重新连接到服务器,则必须创建新的TcpClient
对象并再次呼叫Connect()
。
那就是说,你的问题中有许多明显的误解:
ReceiveTimeout
对象,则不应使用TcpClient
,例如将一些数据发送到服务器。一旦超时时间到期,底层套接字就不再可用了。TcpClient
构造函数当然可以抛出异常。至少,任何尝试new
引用类型对象都可能抛出OutOfMemoryException
,而在TcpClient
的情况下,它最终会尝试创建本机套接字句柄也可能失败。try
/ catch
块之前,请确定在异常情况下您要执行的操作,以确保您的代码不会损坏任何数据并继续操作正确。通常不能优雅地处理OutOfMemoryException
(并且在任何情况下保护new
的所有用法都是不切实际的),但是你当然可以捕获SocketException
,它可能被构造函数抛出。如果抛出该异常,您应该立即放弃创建和使用TcpClient
的尝试,并向用户报告错误,以便他们可以尝试纠正阻止套接字创建的任何问题。ReceiveTimeout
属性,因为如果你没有得到回复你将要做的就是及时放弃了联系,这很好。答案 2 :(得分:1)
很简单:
client.Close();
client = new TcpClient();
client.Connect(host, port);