我目前对我的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分钟从网络流读取,这没有意义,如果客户端完成发送数据,这是否意味着数据只是漂浮在网络空间,并被拉下来? 当然应该是同步的?
答案 0 :(得分:0)
我怀疑我知道我的代码出错了。 事实证明,我正在创建我正在进行发送的TCPClient的范围,已在方法中声明并实例化。
在这种情况下,GAC正在处理它,即使接收服务器还没有完成下载流。
我设法通过创建一个方法来解决它,该方法可以检测客户端在服务器端断开连接的时间,直到它实际断开连接,它将一直循环/等待直到断开连接。
这样,我们等到服务器离开我们。