Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接收和发送,一个TcpListener的故事_C#_Sockets_Network Programming_Tcpclient_Tcplistener - Fatal编程技术网

C# 接收和发送,一个TcpListener的故事

C# 接收和发送,一个TcpListener的故事,c#,sockets,network-programming,tcpclient,tcplistener,C#,Sockets,Network Programming,Tcpclient,Tcplistener,我正在尝试设置一个tcp连接,该连接将接收来自外部用户的xml格式的数据,将其解析为数据表,对数据表执行一些繁重的操作,然后根据这些更改返回并发送xml回复 从外观上看,它似乎工作得很好,但随后测试开始,发现了一些主要问题。如果一次输入多个项目,有时会返回错误的数据(如第三个输入被发送到第四个ins数据应答),并且有可能在非常长的xml输入上无法正确接收所有数据 接收端 此代码用于接收传入的传输,将它们解析为xml文档,然后将它们发送到相应的部分进行处理。有些全局声明(如\u TcpClient

我正在尝试设置一个tcp连接,该连接将接收来自外部用户的xml格式的数据,将其解析为数据表,对数据表执行一些繁重的操作,然后根据这些更改返回并发送xml回复

从外观上看,它似乎工作得很好,但随后测试开始,发现了一些主要问题。如果一次输入多个项目,有时会返回错误的数据(如第三个输入被发送到第四个ins数据应答),并且有可能在非常长的xml输入上无法正确接收所有数据

接收端 此代码用于接收传入的传输,将它们解析为xml文档,然后将它们发送到相应的部分进行处理。有些全局声明(如
\u TcpClient
)我没有显示其初始化,因为我认为它们的数据类型等可能很明显

private void ReceivePortMessages()
{
    int requestCount = 0;
    _TcpListener.Start();
    Debug.Print(" >> Server Started");
    _TcpClient = _TcpListener.AcceptTcpClient();
    Debug.Print(" >> Accept connection from client");

    while (true)
    {
        try
        {
            requestCount = requestCount++;
            NetworkStream networkStream = _TcpClient.GetStream();
            byte[] bytesFrom = new byte[10025];
            networkStream.Read(bytesFrom, 0, (int)_TcpClient.ReceiveBufferSize);
            string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
            dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("\0"));

            XmlDocument xm = new XmlDocument();
            xm.LoadXml(string.Format("<root>{0}</root>", dataFromClient));
            XmlElement root = xm.DocumentElement;
            string rootName = root.FirstChild.Name;

            // Sends the data to an appropriate parser operation.
            RouteInboundXML(rootName, dataFromClient);
        }
        catch (ArgumentOutOfRangeException ex)
        {
            Debug.Print("ReceivePortMessages: Remote client disconnected. " + ex.ToString());
            _TcpClient.Close();
            _TcpListener.Stop();
            ReceivePortMessages();
            return;
        }
        catch (Exception ex)
        {
            Debug.Print("ReceivePortMessages: " + ex.ToString());
            _TcpClient.Close();
            _TcpListener.Stop();
            ReceivePortMessages();
            return;
        }
    }
}

弄明白这一点对我来说将是一个巨大的胜利,因为我在网络编程领域相当缺乏(你也许可以告诉我)。我已经在这个项目上工作了近5个月,现在真的只剩下这部分了。如果有任何编码建议、阅读材料等能帮助我解决这个问题,我将不胜感激。提前感谢。

您的字节缓冲区是静态的,我将从以下位置切换:

byte[] bytesFrom = new byte[10025];
致:

此外,我将从以下位置切换到Unicode编码:

string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
致:

还要在.read()之前添加一个读取超时,从10开始稍微增加,以查看是否有任何更改生效:

networkStream.ReadTimeout = 10;

您是否尝试过在调试/控制台中单独查看输入流,或者使用断点跟踪代码?你在使用任务和后台工作人员吗?我已经完成了所有的工作,当我走这条路的时候,所有的工作都是正确的。它似乎90%的时间都在沿着正确的道路前进,而我却从来没能抓住它。我没有使用后台工作人员,如果这有帮助的话,我可以实现它们。老实说,我只是希望我在网络代码部分搞砸了,考虑到这是通过各种模糊的谷歌代码片段拼凑起来的。我会坚持你当前的构建,暂时不使用后台工作人员,这只是一种无序执行的方式。我在想一个可能的原因。我认为,这只是一个想法,问题在于你如何阅读你的网络流。它可能不会抛出异常,但我认为您的代码不会在执行之前等待接收所有数据。我的猜测是,这对于小数据来说不是问题,因为你在局域网上,网络连接是高速的/几乎是瞬间的。我想你需要一个“接收所有数据”的检查点。@RagingCain好的,你有没有机会举个例子来说明我是如何达到这一点的?链接、代码等?我还没有完全掌握网络代码。从来都不是我的强项。当然,我会尝试在下面的答案中使用你的代码,给我一分钟。
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
string dataFromClient = Encoding.UTF8.GetString(bytesFrom);
networkStream.ReadTimeout = 10;