0

这是从客户端接收值的函数。但问题是我只收到一次。无论我发送多少次数据,MainWindows 上的标签都只会更改一次。

我在这里做错了什么?

private void HandleClientComm(object client)
{
    tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();

    byte[] message = new byte[4096];
    int bytesRead;

    while (true)
    {
        bytesRead = 0;

        try
        {
            bytesRead = clientStream.Read(message, 0, 4096);
        }
        catch
        {
            break;
        }

        if (bytesRead == 0)
        {
            break;
        }

        if (String.IsNullOrWhiteSpace(data))
        {
            ASCIIEncoding encoder = new ASCIIEncoding();
            data = encoder.GetString(message, 0, bytesRead);

            MainWindow.Change(data);
            tcpClient.Close();
        }

        tcpClient.Close();

    }

在客户端,我有以下示例:

try
{
    TcpClient tcpclnt = new TcpClient();
    Console.WriteLine("Connecting.....");
    tcpclnt.Connect("127.0.0.1", 8001);
    Console.WriteLine("Connected");
    while (true)
    {
        Console.Write("Enter the string to be transmitted : ");
        String str = Console.ReadLine();
        Stream stm = tcpclnt.GetStream();
        ASCIIEncoding asen = new ASCIIEncoding();
        byte[] ba = asen.GetBytes(str);
        Console.WriteLine("Transmitting.....");
        stm.Write(ba, 0, ba.Length);
        stm.Flush();
        Console.WriteLine("Sent.....");
    }

    tcpclnt.Close();
    Console.Read();
}
catch (Exception e)
{
    Console.WriteLine("Error..... " + e.StackTrace);
}

只是一个快速的例子,所以当我输入字符串名称时,值第一次改变但是当我第二次输入或者如果我退出客户端程序并重新输入没有任何变化时,标签内容的值等于第一次发送价值。

4

3 回答 3

0

如果你在 tcpClient.Close() 之后使用 clientStream.Read(),它会抛出一个异常,这将运行你的 catch 块并让你跳出循环。(并且您在循环中的两个位置调用 tcpClient.Close() ,因此删除一个将无济于事。这两个都是错误的。)

除非您完全完成连接,否则不应调用 tcpClient.Close() (此外,它只应调用一次。)

还,

“在发送和接收数据时必须关闭NetworkStream。关闭TcpClient不会释放NetworkStream。”

因此,请确保关闭 TcpClient 和 NetworkStream,但前提是您完全完成了循环中的处理。

于 2013-02-19T22:40:25.300 回答
0

您必须使用异步服务器套接字...请参阅 MSDN链接中的此示例

于 2013-02-19T17:51:07.987 回答
0

在您调用的第一次成功读取之后,它看起来像:

tcpClient.Close();

这将阻止任何未来的读取成功。

如果您想避免此类套接字问题,您是否考虑过使用网络库?我是图书馆 networkComms.net 的开发人员,您可以在这里找到一个简短的示例或我的意思。

于 2013-02-19T16:33:44.720 回答