通过套接字接收/发送数据不完全工作,只接收一次值

本文关键字:一次 不完全 套接字 数据 工作 | 更新日期: 2023-09-27 18:00:12

这是从客户端接收值的函数。但问题是我只收到一次。无论我发送多少次数据,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);
}

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

通过套接字接收/发送数据不完全工作,只接收一次值

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

第一次成功读取后,您调用的是:

tcpClient.Close();

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

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

如果在tcpClient.Close()之后使用clientStream.Read(),它将抛出一个异常,该异常将运行您的catch块并使您脱离循环。(您在中调用tcpClient.Close(),两个放在循环中,所以只去掉一个是没有帮助的。两者都错了。)

tcpClient.Close()不应该被调用,除非你完全完成了连接(而且它只应该被调用一次)

此外,

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

因此,请确保关闭TcpClient和NetworkStream,但仅当您完全完成循环中的处理时。