C# - TcpClient。接收后发送数据响应仅在没有迭代的情况下工作

时间:2014-04-01 16:32:38

标签: tcpclient networkstream missing-data

我的服务器接收一些TCP / IP数据并响应客户端:

    private static void startClient(TcpClient clientSocket)
    {
        NetworkStream networkStream = null;
        DateTime fecha = DateTime.Now;
        try
        {
            clientSocket.NoDelay = true;
            networkStream = clientSocket.GetStream();
            string receiveData = readData(clientSocket);
            string responseData = "abc"; //ProcessData(receiveData);

            if (responseData != null)
                writeData(networkStream, responseData);
        }
        catch (SocketException e)
        {
            throw;
        }

        finally
        {
            networkStream.Close();
        }
    }

    private static string readData(TcpClient tcpClient)
    {
        try
        {
            var bytesFrom = new byte[tcpClient.ReceiveBufferSize];

            StringBuilder dataFromClient = new StringBuilder();
            int readCount;
            while ((readCount = tcpClient.GetStream().Read(bytesFrom, 0, tcpClient.ReceiveBufferSize)) != 0)
            {
                dataFromClient.Append(Encoding.ASCII.GetString(bytesFrom, 0, readCount));
            }

            //int bytesRead = tcpClient.GetStream().Read(bytesFrom, 0, tcpClient.ReceiveBufferSize);
            //string dataFromClient = Encoding.ASCII.GetString(bytesFrom, 0, bytesRead);
            return dataFromClient.ToString();
        }
        catch (SocketException e)
        {
            throw;
        }
    }


    private static void writeData(NetworkStream networkStream, string dataToClient)
    {
        Byte[] sendBytes = null;
        try {
                sendBytes = Encoding.ASCII.GetBytes(dataToClient);
                networkStream.Write(sendBytes,0, sendBytes.Length);
                networkStream.Flush();    
            }
         catch(SocketException e)
        {
            throw;
        }
    }

使用此解决方案,客户端永远不会收到发送的响应:

http://postimg.org/image/6srtslf2f/

然而,将接收更改为对NetworkStream.Read的单次调用...

    private static string readData(TcpClient tcpClient)
    {
        try
        {
            var bytesFrom = new byte[tcpClient.ReceiveBufferSize];
            int bytesRead = tcpClient.GetStream().Read(bytesFrom, 0, tcpClient.ReceiveBufferSize);
            string dataFromClient = Encoding.ASCII.GetString(bytesFrom, 0, bytesRead);
            return dataFromClient.ToString();
        }
        catch (SocketException e)
        {
            throw;
        }
    }

......客户收到回复

http://postimg.org/image/uih9hadfr/


更新

我找到了解决方案here。我已经用2/3种方法修复了它。首先处理EOS结束消息。如果客户端工作不正常,则Seccond设置接收超时,并且在没有EOS的情况下发送错误数据:

    private static string readData(TcpClient tcpClient)
    {
        var clientStream = tcpClient.GetStream();
        var dataFromClient = string.Empty;
        var buffer = new byte[RECEIVE_BUFFER_SIZE];
        if (!clientStream.CanRead)
            return "";
        tcpClient.ReceiveTimeout = RECEIVE_TIMEOUT;
        try
        {
            int readCount;
            while ((readCount = clientStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                dataFromClient += Encoding.ASCII.GetString(buffer, 0, readCount);
                if (dataFromClient.EndsWith(EOS))
                    return dataFromClient;
            }
            return dataFromClient.ToString();
        }
        catch (Exception ex)
        {
            var socketExept = ex.InnerException as SocketException;
            if (socketExept != null && socketExept.SocketErrorCode == SocketError.TimedOut)
                Logger.Warn(string.Format("Se excedio el timeout de recepcion: {0} ms",RECEIVE_TIMEOUT));
            else
                Logger.Error(string.Format("Error leyendo el mensaje recibido"), ex);
            return dataFromClient.ToString();
        }
    }

0 个答案:

没有答案