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

时间:2013-02-19 16:10:05

标签: c# sockets

这是从客户端接收值的功能。但问题是我只收到一次。无论我发送一些数据的时间长短,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);
}

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

3 个答案:

答案 0 :(得分:0)

看起来在您第一次成功阅读之后:

tcpClient.Close();

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

如果您想避免这类插座问题,您是否考虑过使用网络库?我是图书馆networkComms.net的开发人员,您可以找到一个简短的例子或我的意思here

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

此外,

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

因此请确保关闭TcpClient和NetworkStream,但只有在循环中完成处理时才会关闭。