TCPClient不正确地读取数据

时间:2016-02-13 10:47:57

标签: c# tcpclient

我开发了一个从秤中读取数据的项目。 我可以阅读比例发送给我的数据;但是,收到的数据集并不方便。规模品牌是Desis。

示例输出如下。

Output:

T,GS   17.27 g
ST,GS   17.27 g
T,GS   17.27 g
T,GS   17.27 g
27 g
ST,GS   17.27 g
ST,GS   17.27 g
ST,GS   17.27 g
ST,GS   17.27 g
ST,GS   17.27 g
ST,GS   17.27 g
30.89 g

ST,GS   17.27 g
ST,GS   17.27 g
ST,GS   17.27 g
ST,GS   17.27 g

收到的数据必须是ST,GS连续17.27克。

我的书面代码:

public void Connect()
{
            m_tcpClient = new TcpClient();

            m_tcpClient.Connect(m_hostAdress, m_port);

}

public string ReadWithNewLine()
{

            this.Connect();
            m_netWorkStream = m_tcpClient.GetStream();
            m_streamReader = new StreamReader(m_netWorkStream);

            if (m_streamReader != null)
            {
                try
                {
                    m_readText = m_streamReader.ReadLine().TrimEnd();

                }
                catch (Exception ex)
                {

                }
            }
            return m_readText + "\r\n";
}

代码中是否有错误?

3 个答案:

答案 0 :(得分:0)

我认为您的代码中没有任何错误。但我认为你一次只读一行。如果您想要阅读所有行,那么您可以使用

 m_readText = m_streamReader.ReadToEnd().TrimEnd();

但是如果你想逐行阅读并按照你的问题获取数据,那么我认为发件人正按照该顺序发送数据。

答案 1 :(得分:0)

您正在ReadWithNewLine的每次通话中重新创建TcpClient。如果你这样做,另一端的TcpServer必须关闭旧连接并启动一个新连接,协商连接,每次都会丢失几个字节。

尽可能接近您当前的设计我建议您尝试使用以下更改进行设置:

    public void Connect()
    {
        if (m_tcpClient == null)
        {
            m_tcpClient = new TcpClient();
            m_tcpClient.Connect(m_hostAdress, m_port);
            m_netWorkStream = m_tcpClient.GetStream();
            m_streamReader = new StreamReader(m_netWorkStream);
        }
    }

    public string ReadWithNewLine()
    {

        this.Connect();

        try
        {
            m_readText = m_streamReader.ReadLine().TrimEnd();
        } 
        catch (Exception allExceptions)
        {
            m_readText = "Exception:" + allExceptions.Message;
            if (m_tcpClient!=null)
            {
                m_tcpClient.Close();
                m_tcpClient = null; // reset connection
            }
        }
        return m_readText + "\r\n";
    }

注意我如何检查Connect方法,验证TcpClient是否已存在实例。如果没有,我创建一个并建立流和阅读器。

第一次拨打ReadWithNewLine时,它会拨打Connect并设置与您的比例的连接。在下一次调用时,Connect将不执行任何操作并重新使用现有读取器来获取字节。

我也略微改变了你的异常处理。我能做的最少的是提供一些反馈并重置TcpClient。您可能希望进一步增强它,以便仅捕获那里发生的特定异常。

答案 2 :(得分:0)

您可以使用大量方法从TCPClient检索响应数据。我使用流动代码来格式化输出。

        private int TCPTimeOut = 10000;
        private int NetStreamTimeOut = 10000;
        private string ipAddress = "";
        private int port;
        private int intThreadSleep;
        private bool disposed = false;
        private TcpClient tcpClient = new TcpClient();

        private void GetTCPData()
        {
            tcpClient.Connect(ipAddress, port);
            tcpClient.ReceiveTimeout = TCPTimeOut;
            NetworkStream stream = tcpClient.GetStream();
            stream.ReadTimeout = NetStreamTimeOut;

            Byte[] data = new Byte[5210];
            string responseData = String.Empty;

            while (true)
            {
                Int32 bytes = stream.Read(data, 0, data.Length);
                System.Threading.Thread.Sleep(intThreadSleep);
                responseData = responseData + System.Text.Encoding.ASCII.GetString(data, 0, bytes);

                if (bytes > 10)
                {
                    var table = responseData.Split(new string[] { "\r\n", "\r", "\n" },
                                                 StringSplitOptions.None);

                    if (table.Count() > 3)
                    {
                        string line1 = table[0];
                        string line2 = table[1];
                        string line3 = table[2];
                        string line4 = table[3];
                        string line5 = table[4];
                        string line6 = table[5];

                        // SaveData(ipAddress, line1, line2, line3, line4, line5, line6);
                    }
                }
                responseData = String.Empty;
            }

            if (tcpClient != null)
            {
                tcpClient.GetStream().Close();
                tcpClient.Close();
            }

        }