“无法从传输连接中读取数据。”请大家帮忙,谢谢。

satan_dongdong 2008-12-22 09:36:12
我的代码如下,请大家帮忙看看。

发送数据代码:
//
//将信息队列发送
//
public static void Send(ArrayList array, Queue queue, bool validate)
{
MemoryStream sendStream = GetSendStream(array, validate);
sendStream.Position = 0;
Byte[] sendBytes = new Byte[sendStream.Length];
sendStream.Read(sendBytes, 0, (int)sendStream.Length);

queue.Enqueue(sendBytes);
}
//
//将用户信息写进一个队列
//
public void Login()
{
ArrayList message = new ArrayList();

message.Add(formMain.userInfo);
message.Add(userPosition);

Send(message, sendQueue, true);
}




//
//将接收到的信息进行再分配处理
//
public static ArrayList ReceiveScheduler(TcpClient client, NetworkStream stream)
{
byte[] bytes = new byte[client.ReceiveBufferSize];
ArrayList message = null;

int bytesRead = stream.Read(bytes, 0, (int) client.ReceiveBufferSize); // 提示这行出错。

if (bytesRead > 0)// 图过信息队列中,信息内容不为空,则读出
{
try
{
int sendLength = BitConverter.ToInt32(bytes, 1) + 9;

if (sendLength == bytesRead)
{
MemoryStream mStream = new MemoryStream(bytes, 9, sendLength - 9);
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;
formatter.TypeFormat = FormatterTypeStyle.TypesWhenNeeded;
message = (ArrayList) formatter.Deserialize(mStream);
message.Add(BitConverter.ToUInt32(bytes, 5));
}
}
catch
{
//
// 忽略
//
}
}

return message;
}

断点调试的时候,错误出现在这一行:
int bytesRead = stream.Read(bytes, 0, (int) client.ReceiveBufferSize);
错误提示为:“无法从传输连接中读取数据”

之前在传输其它数据的时候,数据大小大约为四、五百这样,没有出现这个错误;但是在传了某一个信息队列,大概300多的时候就出现这个错误了。

请问各位,这个错误一般是因为什么原因导致产生的呢?应该如何解决?或者说在实际应用中应该如何避免呢?请大家帮帮忙,谢谢。
...全文
2952 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengniumaxi 2009-09-15
  • 打赏
  • 举报
回复
服务器端没有接收到数据或者没有针对此数据进行应答。
出现此问题的原因很多,不过我的判断基本上就是服务器没接收到数据或者是服务器没有应答,之所以这么说,因为我以前的程序出现这个原因的时候,我调试发现,大多数情况是server并没接收到数据。

个人分析,产生此问题的原因如下:
对于短连接:同步接收,client的发送频繁,而服务器接收有个等待时间,当sleep期间,数据错过。异步回调,由于发送频繁,没反应过来。
对于长连接:同步同样有此情况。对于异步,应该不存在此种情况。

故综合分析,如果想避免此种情况发生,对于同步,主要是接收时的休眠时间问题;对于异步,好像不适合做短连接。
那修改时,按照此要点修改即可解决问题。
satan_dongdong 2009-09-15
  • 打赏
  • 举报
回复
顶一顶
ap3255 2009-09-08
  • 打赏
  • 举报
回复
楼主解决了么?小弟也遇到此类 问题,麻烦指点下 谢谢。550816259@qq.com
fengniumaxi 2009-08-10
  • 打赏
  • 举报
回复
很多时候之所以会出现这种问题,好像服务器端没有接收到数据或者没有针对此数据进行应答。
satan_dongdong 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yagebu1983 的回复:]
有数据吗??
最好单步调试一下!!
[/Quote]

数据是有的
yagebu1983 2008-12-26
  • 打赏
  • 举报
回复
有数据吗??
最好单步调试一下!!
satan_dongdong 2008-12-26
  • 打赏
  • 举报
回复
哇,怎么发了那么多遍啊??看来网速不好就是不行啊。

是这样的,我这里是一个C/S结构的程序,用TCPClient进行通讯,所以要用到NetworkStream做为客户端与服务器端之间的交流信息,然后在读写NetworkStream的时候就出现了以上所描述的问题。
net5i 2008-12-26
  • 打赏
  • 举报
回复
这就要看搂主的数据发送是什么样的一个过程了
我这里使用HttpWebRequest和HttpWebResponse测试是可以的,能够把网页内容给Down下来。
satan_dongdong 2008-12-26
  • 打赏
  • 举报
回复
byte[] bytes = new byte[8];
int pos = 0;
while (stream.ReadByte() != -1)
{
pos++;
if(bytes.Length <= pos)
{
byte[] newBytes = new byte[pos+1];
Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
bytes = newBytes;
}
stream.Read(bytes, pos, 1);
}

用了这个代码当 pos=217时,则弹出错误提示:“无法从传输连接中读取数据”,这是怎么一回事呢?麻烦请看看
satan_dongdong 2008-12-26
  • 打赏
  • 举报
回复
byte[] bytes = new byte[8];
int pos = 0;
while (stream.ReadByte() != -1)
{
pos++;
if(bytes.Length <= pos)
{
byte[] newBytes = new byte[pos+1];
Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
bytes = newBytes;
}
stream.Read(bytes, pos, 1);
}

用了这个代码当 pos=217时,则弹出错误提示:“无法从传输连接中读取数据”,这是怎么一回事呢?麻烦请看看
satan_dongdong 2008-12-26
  • 打赏
  • 举报
回复
byte[] bytes = new byte[8];
int pos = 0;
while (stream.ReadByte() != -1)
{
pos++;
if(bytes.Length <= pos)
{
byte[] newBytes = new byte[pos+1];
Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
bytes = newBytes;
}
stream.Read(bytes, pos, 1);
}

用了这个代码当 pos=217时,则弹出错误提示:“无法从传输连接中读取数据”,这是怎么一回事呢?麻烦请看看
net5i 2008-12-26
  • 打赏
  • 举报
回复
嗯,小了会自动重新分配内存的,上面代码中数组的动态分配过程和ArrayList对象是一致的,搂主放心好了
satan_dongdong 2008-12-26
  • 打赏
  • 举报
回复
byte[] bytes = new byte[8];

这个地方有点不明白,为什么是 new byte[8],万一小了怎么办?
net5i 2008-12-26
  • 打赏
  • 举报
回复
前面已经说了哟,NetworkStream不支持查找的,所以也就不支持重复读的,因为当你读过之后,指针自然就移动到流结尾的位置处了,然后DataAvailable肯定会自动变成false的
搂主的client.ReceiveBufferSize的值肯定不等于流的长度,所以会出现错误,所以建议搂主使用11楼的代码,不过测试了一下,代码有个错误,改正一下:

byte[] bytes = new byte[8];
int pos = 0;
while (stream.ReadByte() != -1)
{
pos++;
if(bytes.Length <= pos)
{
byte[] newBytes = new byte[pos+1];
Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
bytes = newBytes;
}
stream.Read(bytes, pos, 1);
}

然后就可以使用这个bytes变量了。
satan_dongdong 2008-12-26
  • 打赏
  • 举报
回复
调试发现新问题,本来stream.DataAvailable为true,但是如果运行这句之后:

int bytesRead = stream.Read(bytes, 0, (int) client.ReceiveBufferSize);

stream.DataAvailable为false

如果删除此行,stream.DataAvailable的值就一直为true,请问这是怎么回事??希望大家能看看,谢谢。
wangzhe1945 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 satan_dongdong 的回复:]
引用 9 楼 net5i 的回复:
搂主把这里:byte[] bytes = new byte[client.ReceiveBufferSize];
改成:byte[] bytes = new byte[stream.Length];
看看呢


你好,按照你说的改了,结果弹出“此流不支持查找操作”的对话框,也不知道是何原因?还请各位耐心看看,谢谢。
[/Quote]

网络流不支持查找和length
bbbbbb888888 2008-12-25
  • 打赏
  • 举报
回复
7L正解,可以加上超时.规定时间DataAvailable 一直为false,就可以判断超时,或者定义receivetimeout属性.
判断IOException为超时
net5i 2008-12-24
  • 打赏
  • 举报
回复
我感觉是因为搂主byte[] bytes = new byte[client.ReceiveBufferSize]; 这样定义的字节长度并不一定等于NetworkStream 的长度,所以上面我建议改成stream.Length,但没想到她不支持

那么,搂主一个字节一个字节的读取比较好:
byte[] bytes = new byte[8];
int pos = 0;
while (stream.ReadByte() != -1)
{
pos++;
if(bytes.Length < pos)
{
byte[] newBytes = new byte[pos+1];
Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
bytes = newBytes;
}
stream.Read(bytes, pos, 1);
}
这样读应该可以了,不过我是直接在这里敲的代码,难免有错误,搂住自己测测吧
satan_dongdong 2008-12-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 net5i 的回复:]
搂主把这里:byte[] bytes = new byte[client.ReceiveBufferSize];
改成:byte[] bytes = new byte[stream.Length];
看看呢
[/Quote]

你好,按照你说的改了,结果弹出“此流不支持查找操作”的对话框,也不知道是何原因?还请各位耐心看看,谢谢。
net5i 2008-12-24
  • 打赏
  • 举报
回复
搂主把这里:byte[] bytes = new byte[client.ReceiveBufferSize];
改成:byte[] bytes = new byte[stream.Length];
看看呢
加载更多回复(8)
概述: 冬天到了,又到了靠烧煤取暖的季节了,虽然我们大南方还不知道啥时候才能享受到北方小伙伴一样的集供暖,但是冬天的霾却不分彼此的席卷了全国各地。本方案使用的是RT-Thread的嵌入式实时系统,通过PMS70003传感器采集空气的PM2.5浓度数据,并通过WiFi传输到移动onenet平台上,可以远程查看PM2.5实时数据。 开发环境: RT-Thread版本: 4.0.3 开发工具:使用RT-Thread Studio2.0.0 硬件平台:基于RT-Thread官方ART-Pi开发板+自制传感器拓展板 RT-Thread使用情况概述: 本项目基于RT-Thread内核版本: Ver 4.0.3开发,使用RT-Thread Studio V2.0.0开发,使用的软件包包括cjson、onenet、webclient、pahomqtt、fal、easyflash、u8g2; 打开的组件和服务层有:finsh命令、DFS、ulog日志、C++、lwIP、POSIX、libc、ymodem,以及串口、Pin、SPI、SFUD、SDIO。 硬件框架: 本项目使用的是官方的Art-Pi开发板+自己做的传感器拓展板制作的,拓展板上包含了一个SHT20的温湿度传感器,一个攀藤的PMS7003PM2.5传感器、一个炜盛的MQ-4B半导体可燃气体传感器、一个0.91”Oled单色显示屏,以及一个拨盘按键。其PMS7003是通过串口把采集到的数据传输到ART-PI上,由板载WiFi连接到移动onenet云上实现数据上传。SHT20和OLED共用一组IIC数据总线,可燃气体传感器占用了两个ADC口(一组检测气体浓度,一组检测传感器失效),并且可以通过背面跳线选择ADC口。按键占用了额外的三个GPIO用于设定一些配置信息。 软件框架说明: 首先RT-Thread启动后,对各部分外设进行初始化,然后进入pms7003的读取线程,该线程负责采集PMS7003上传上来的PM2.5浓度数据,并在线程里对数据进行校验求解后,通过onenet线程,我们把采集到的数据通过WiFi定时推送到移动onenet云平台,推送频率为2S/次。通过后台的数据流信息页面,可以看到实时的浓度数据信息。 软件模块说明: 软件采用的RTT4.0.3为内核基础,使用了一个独立线程来读取PMS传感器的数据,一个onenet软件包来实现联网推送的服务,最后由板载的WiFi模块负责连接到网络并把数据推送上去。 演示效果: 附上视频效果: 比赛感悟: 在使用rt-thread实时系统以前,我一直都是简单的使用裸机开发,纯粹的单流水线模式,经常会因为各种时间任务分配问题搞得头大,每种硬件使用起来得先仔细了解数据手册,了解器件性质,功能,然后才敢上板子,撸代码。 这次其实也是我第一次接触嵌入式实时操作系统这么一个方式来开发单片机,讲真,里面走了不少的弯路,也有很多没遇到过的坑。不得不说,RT-Thread的文档支持工作做的还是非常到位的,每个细节、功能都做了详细的介绍,但是诚如此还是有一部分我没太想明白的地方,这里就多亏了官方的比赛群以及我的小伙伴们,遇到很多事情找他们帮忙都能很快的解决掉。 本次比赛我还是学到了很多的新鲜知识,而且RTT的使用的便捷性给我了很大的震撼,有许多代码例程写的都很经典,后面板子上的几个设备我还要继续调试下去,争取把这个项目继续走下去,把rtt学得更深入一些。希望以后也能自己独立开发一些项目。把自己平时那么多奇奇怪怪的小点子都实现出来。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧