用于同步消息交换的客户端类:
public class AsClient
{
private TcpClient connection;
public AsClient(int serverPort, String ip)
{
connection = new TcpClient(ip, port);
}
public AsMessage sendMessage(AsMessage message)
{
System.Diagnostics.Debug.WriteLine("Connected: " + connection.Connected);
NetworkStream ns = connection.GetStream();
StreamReader reader = new StreamReader(ns);
StreamWriter writer = new StreamWriter(ns);
// Send Message:
String msgToSendEncoded = message.encode();
writer.WriteLine(msgToSendEncoded);
writer.WriteLine("\n"); // each message is terminated by a paragraph
writer.Flush();
// Receive Message:
String msgReceivedRaw = reader.ReadLine();
AsMessage response = AsMessage.decode(msgReceivedRaw);
reader.Dispose();
writer.Dispose();
ns.Close();
return response;
}
}如果我调试这个应用程序,发送的第一条消息和接收到的响应都能很好地工作,但是只要我想发送第二条消息,TcpClient.getStream()就会在InvalidOperationException上失败,这说明连接不再建立了。
问题是我没有主动关闭任何地方的连接。如果我将connection.Connect(主机,端口)放在调用getStream()之前,它会失败,除非套接字仍然连接,即使connection.Connected是false。
有什么办法解决这个问题吗?
发布于 2013-07-24 13:20:31
由于我有经验,处置,关闭底层流。
所以你关闭了处理程序上的连接。
发布于 2019-06-07 05:08:53
我在这段代码中遇到了同样的问题,它按照GetStream():https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.getstream?view=netframework-4.8的MS文档中的步骤进行复制。
public void Send(String message)
{
try
{
// Translate the passed message into ASCII and store it as a Byte array.
Byte[] data = Encoding.ASCII.GetBytes(message);
// Get a client stream for reading and writing.
NetworkStream stream = Client.GetStream();
stream.Write(data, 0, data.Length);
stream.Close(); // this also closses the connection the server!
}
catch (Exception e)
{
LogException(e);
}
}我们在服务器端看到的是: 1)建立了连接。( 2)信息永远不会到达。3)当stream.Close()语句执行时,服务器报告客户端关闭了连接。检查流的属性,我可以看到流拥有套接字。所以,它必须关闭它也必须关闭它的插座。为什么?
https://stackoverflow.com/questions/17834693
复制相似问题