网络流 - 每次读取的读取量

时间:2014-05-01 10:45:30

标签: c# networking stream byte

我目前对我的c#项目有点困惑。

我有2个应用程序,它们都有一个公共类定义,我称之为NetMessage

NetMessage包含MessageType字符串属性,以及2个List列表。 我的想法是,我可以将这个类打包为类,并将数据作为byte []发送到网络中。

由于Network Streams没有公布他们接收的数据量,因此我修改了Send方法,以便在实际byte []之前发送NetMessage byte []的大小。

private static byte[] ReceivedBytes(NetworkStream MainStream)
    {
        try
        {
            //byte[] myReadBuffer = new byte[1024];
            int receivedDataLength = 0;
            byte[] data = { };
            long len = 0;
            int i = 0;
            MainStream.ReadTimeout = 60000;
            //MainStream.CanTimeout = false;
            if (MainStream.CanRead)
            {
                //Read  the length of the incoming message
                byte[] byteLen = new byte[8];
                MainStream.Read(byteLen, 0, 8);
                len = BitConverter.ToInt64(byteLen, 0);
                data = new byte[len];

                //data is now set to the appropriate size for the expected message
                //While we have not got the full message
                //Read each individual byte and append to data.
                //This method, seems to work, but is ridiculously slow,

                while (receivedDataLength < data.Length)
                {
                    receivedDataLength += MainStream.Read(data, receivedDataLength, 1);
                }
                //receivedDataLength += MainStream.Read(data, receivedDataLength, data.Length);
                return data;
            }
        }
        catch (Exception E)
        {
            //System.Windows.Forms.MessageBox.Show("Exception:" + E.ToString());
        }
        return null;
    }

我试图将下面的size参数更改为1024或者是data.Length,但是我得到了时髦的结果。 receivedDataLength + = MainStream.Read(data,receivedDataLength,1);

将其设置为data.Length似乎在发送的类的大小为几mb时会导致问题。 像我在其他示例中看到的那样将缓冲区大小设置为1024,当传入消息的大小很小时会导致失败,例如843字节,它错误地说我试图读出界限或其他东西。

以下是用于首先发送数据的方法类型。

public static void SendBytesToStream(NetworkStream TheStream, byte[] TheMessage)
    {

        //IAsyncResult r = TheStream.BeginWrite(TheMessage, 0, TheMessage.Length, null, null);
        // r.AsyncWaitHandle.WaitOne(10000);
        //TheStream.EndWrite(r); 
        try
        {
            long len = TheMessage.Length;

            byte[] Bytelen = BitConverter.GetBytes(len);

            TheStream.Write(Bytelen, 0, Bytelen.Length);
            TheStream.Flush();
            // <-- I've tried putting thread sleeps in this spot to see if it helps
            //I've also tried writing each byte of the message individually
            //takes longer, but seems more accurate as far as network transmission goes?
            TheStream.Write(TheMessage, 0, TheMessage.Length);
            TheStream.Flush();
        }
        catch (Exception e)
        {
            //System.Windows.Forms.MessageBox.Show(e.ToString());
        }
    }

我希望将这两种方法设置为可靠地发送和接收数据。 我使用它的应用程序,监视游戏目录中的屏幕截图文件夹, 当它检测到TGA格式的屏幕截图时,它将其转换为PNG,然后获取其byte []并将其发送到接收器。 接收器然后将其发布到Facebook(我不希望我的客户端应用程序中分发我的FB令牌),因此服务器/代理的想法。 它很奇怪,但当我单步执行代码时,转移总是成功的。 但如果我全速运行,没有断点,它通常会告诉我连接已被远程主机等关闭。 客户端通常几乎立即完成数据发送,即使它是4mb文件。 接收器花费大约2分钟从网络流读取,这没有意义,如果客户端完成发送数据,这是否意味着数据只是漂浮在网络空间,并被拉下来? 当然应该是同步的?

1 个答案:

答案 0 :(得分:0)

我怀疑我知道我的代码出错了。 事实证明,我正在创建我正在进行发送的TCPClient的范围,已在方法中声明并实例化。

在这种情况下,GAC正在处理它,即使接收服务器还没有完成下载流。

我设法通过创建一个方法来解决它,该方法可以检测客户端在服务器端断开连接的时间,直到它实际断开连接,它将一直循环/等待直到断开连接。

这样,我们等到服务器离开我们。