【问题标题】:c# tcpclient program writing to stream but client not receiving datac# tcpclient 程序写入流但客户端未接收数据
【发布时间】:2015-08-10 13:10:18
【问题描述】:

我编写了一个 TCPClient 程序以在我的 PC 上运行。它首先启动一个 TCP 侦听器以侦听特定端口,然后在多个线程上读取/写入多个 TCP 客户端。
我可以从客户端读取数据,但是每当我尝试向其发送数据时,程序都会显示它已发送数据,但客户端没有收到任何内容。

代码如下:

            TcpClient client = listener.AcceptTcpClient();
            var childSocketThread = new Thread(() =>
            {
                if (client.Connected)
                {
                    using (NetworkStream stream = client.GetStream())
                 {
                    Console.WriteLine("connected");
                    byte[] data = new byte[1000];
                    try
                    {
                        if (stream.CanRead)
                        {
                            stream.Read(data, 0, 1000);
                            string dataStr = Encoding.ASCII.GetString(data);
                            string dataa = dataStr.TrimEnd('\0');
                            //Console.WriteLine(dataa);
                            if (dataa.Length > 10)
                            {
                                deviceid = ParseRequest(dataa);

                                byte[] sendnow = Encoding.ASCII.GetBytes(reply[deviceid]);

                                Array.Clear(data, 0, 1000);
                                Console.WriteLine("Recieved data: " + dataa);
                                Console.WriteLine("Sending data");
                                using (StreamWriter writer = new StreamWriter(stream))
                                {
                                    writer.AutoFlush = true;
                                    writer.WriteLine(reply[deviceid]);
                                }
                                Console.WriteLine(reply[deviceid]);
                                Console.WriteLine("Sent");
                            }

                            Console.WriteLine();
                        }
                    }
                    catch (Exception es)
                    {
                        Console.WriteLine(es);
                    }
                 }
                }

            });
            childSocketThread.Start();    

我使用的服务器设备是 PLC。另外,我已经尝试过的事情:
1) 使用 Socket.Send 方法直接发送。
2) 使用 NetworkStream 方法直接发送。
3) 接受 TCP 连接作为套接字。 (Socket device = listener.AcceptSocket)。

这些方法似乎都没有发送到设备,即使程序告诉我发送数据没有问题,因为它在尝试发送数据后显示“已发送”。 我从此链接http://www.codeproject.com/Articles/488668/Csharp-TCP-Server 下载了另一个程序。他们提供的测试应用程序能够在与我在同一台 PC 上运行的程序相同的端口上发送和接收数据。

我无法就如何诊断以及更重要的是解决此问题获得任何指导。有什么想法吗?

2015 年 8 月 10 日上午 11:18 更新:
该程序的输出如下:

2015 年 8 月 10 日上午 11:32 更新:
系统日志控制台的输出:

2015 年 8 月 10 日下午 12:07 更新:
Wireshark 的输出:

【问题讨论】:

  • 您需要向我们展示客户端和服务器代码。我已经看到你做错了很多事情,但我们确实需要双方。
  • 客户端代码是BCL语言的PLC代码,不知道有没有人知道。但另一方面,测试代码应用程序(链接到代码项目)可以在相同的客户端代码上正常工作。
  • 您确定要发送一个以 CRLF 结尾的字符串吗?您似乎从设备获得的数据表明\0 是终止符。并且绝对避免在网络流附近的任何地方使用StreamWriter/StreamReader :))
  • 更重要的是,如果 \0 是当前请求的终止符,他可能会读取更多数据并尝试解析它,因为缓冲区是 1000 长。此外,Read 函数返回一个 int 值,告诉您它实际上能够读取多少内容。保持从流中读取直到达到 \0 或 1000 很重要,因为您的客户端可能只能读取 11 个字节,这可能不足以正确解析它。
  • 另外,包括您的客户端程序从接受连接到发送的输出。让我们看看你得到什么,然后解析和发送

标签: c# sockets tcpclient tcpserver


【解决方案1】:

我们需要您发布双方代码。不过,这里有一些运行良好的代码,您可以使用它来查看您是否做错了什么。

http://www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多