NetworkStream.Read不会抛出任何异常

时间:2016-04-08 12:49:42

标签: c# tcp networkstream

我无法运行此示例: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx

我用他们的代码改变的唯一一件事就是将所有内容放在main方法中,当然还有我的端口名。我可以连接到我的服务器,甚至可以发送数据。但是就行了

Int32 bytes = networkStream.Read(data, 0, data.Length); 

程序无异常地停止运行。微软如何拥有代码不起作用?我的服务器还没发送任何内容,但我认为这不重要吗? (尽管它收到了完美的。)我已经读过一些你不能在其他帖子中出现异常的东西,但我没有。 我也试过这个帖子: C# tcp socket (networkstream.read won't work with 8.1)

它不起作用。我赢得了胜利7 thoguh。但是我希望这能开启一个全新的窗户。

2 个答案:

答案 0 :(得分:2)

NetworkStream.Read阻塞,直到数据可用,连接关闭(在这种情况下它将返回0)或发生异常。它是这样设计的。

如果您的服务器将发送数据,您的客户端程序将继续并能够处理响应。

答案 1 :(得分:0)

NetworkStream.Read()是同步调用,它将等待直到收到响应。要读取不同长度的数据,您可以执行以下操作。

注意:我假设服务器只为请求发送一个响应。

private string GetResponse(string command)
{
    //Send request
    TcpClient client = new TcpClient(HOST, PORT);
    Byte[] data = Encoding.ASCII.GetBytes(command);
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);

    //Read response
    data = new Byte[BUFFER_SIZE];
    String response = String.Empty;
    stream.ReadTimeout = READ_TIMEOUT;
    while (!response.EndsWith(RESPONSE_END))
    {
        int bytes = stream.Read(data, 0, data.Length);
        response += Encoding.ASCII.GetString(data, 0, bytes);
    }
    response = response.Remove(response.Length - RESPONSE_END.Length);
    stream.Close();
    client.Close();

    //Return
    return response;
}