【发布时间】:2013-02-23 03:40:18
【问题描述】:
我有一个用 C# 编写的简单文件服务器\客户端应用程序。但我经常遇到我的流将两个不同的读取写入单个缓冲区的问题。我有一个同步的流,仍然没有帮助。有什么建议么?谢谢!
System.Threading.Thread.Sleep(25);
receive_fspos = new byte[30];
int bytesread = stream_1.Read(receive_fspos, 0, receive_fspos.Length);//this is where it gets combined
if (bytesread == 0)
{
finished = true;
System.Threading.Thread.Sleep(25);
}
string string_1 = utf.GetString(receive_fspos).TrimEnd(new char[] { (char)0 });
int fsposition = (int)Convert.ToInt64(string_1);
bytestosend = fsposition;
filestream.Position = fsposition;
byte[] buffer_1 = new byte[bufsize];
int bytesreadfromfs = filestream.Read(buffer_1, 0, buffer_1.Length);
stream_1.Write(buffer_1, 0, buffer_1.Length);
Console.Write("\rSent " + fsposition + " / " + length + " bytes");
finished = true;
【问题讨论】:
-
您是说,例如,您将两条 10 字节的消息写入一个流并在另一端接收 20 字节?这就是为什么它被称为流。一端进入的字节以相同的顺序从另一端出来,没有重复或丢失。没有大于字节的实体的概念,即消息或记录。读取中接收的字节数取决于整个网络的缓冲。如果你总共写了 100 个字节,你可以从第一次读取得到 43 个字节,从下一个读取得到 56 个字节,然后是一个单独的字节。
-
不完全是。我已将每次读取的长度设置为哦,比如说 30 字节,每条消息实际上是 8 字节,它在一次调用 stream.read() 方法时将服务器的两个 stream.write() 调用写入缓冲区。它不应该这样做,它应该将 8 字节消息和 22 个空白字节写入一个 30 字节缓冲区。对吗?
-
抱歉,读取将检索所有可用数据,直到缓冲区大小。缓冲区中的任何剩余字节都不会受到影响,即被清除。如果您想将字节流解释为消息,那么您需要创建一种方法来确定每条消息的边界。我使用了一个标头,其中前 2 或 4 个字节包含消息的长度。附加标头字段可能包含消息类型、子类型、id、...。由于字节是按任何大小的组接收的,因此您必须准备好从片段中重新组装消息。连长度字段都可以碎片化!
-
哈哈我害怕这个,使用UDP的唯一原因是未指定的接收长度。我会想到一些东西谢谢伙计。
标签: c# client client-server filestream