当前位置:编程学习 > C#/ASP.NET >>

连续发送图片,重传机制怎么建立,求指导

最近在做的socket网络编程,服务器连续发送一系列图片,客户端接受图片,然后在picturebox中显示。服务器是在for循环中发送,客户端是在for循环中接受。采用的是send与receive发送接受数据。现在遇到的问题是,当客户端接受中间某一张图片出现问题时,程序就会卡死。
之后就开始尝试建立错误重传机制,或者是干脆把错误的那一张给抛弃,从下一张开始重新发送。如果客户端出现异常之后,怎么跟服务器做到沟通,能同步跳到for循环的下一张图片的发送与接受。
现在做的一些尝试就是,客户端检测到错误之后,在catch中执行continue语句,跳到循环的下一张。服务端在等待100ms之后还没有接到客户端发来的确认信息,也在catch中执行continue语句,跳到循环的下一张。
没有做到同步处理,这样写还是会出现问题,在某一张出现问题之后,程序卡死。求大神指导 --------------------编程问答-------------------- 采取一问一答的方式
循环
{
服务端问:发送图片
客户端答:接收成功
} --------------------编程问答--------------------
引用 1 楼 soaringbird 的回复:
采取一问一答的方式
循环
{
服务端问:发送图片
客户端答:接收成功
}


客户端跟服务端是在不同的电脑上面运行,怎么能做到在一个大循环中啊 --------------------编程问答-------------------- 客户端当然不知道有多少个图片,它只是接收图片、应答确认。
循环的是服务端,从图片序列里取一个,发送,等待应答,指定时间内有应答则再取一个发送,没应答则重发,如此循环直至全部发送完成。 --------------------编程问答-------------------- 你也可以采用多问多答的方式,但每次问答都要一一对应并完成 --------------------编程问答--------------------
引用 楼主 qijun1994 的回复:
服务器是在for循环中发送,客户端是在for循环中接受。

发送方循环就行了,客户端监听请求,按照约定返回一个操作结果
并且服务端异步发送比较好,不用待到前面那张的结果才去发第二张,而是用回调判断前面那张是否成功了,没成功就重发,成功了就发送队列中剩余的那些
如果接收到的顺序一致,可以加一个序号 --------------------编程问答--------------------
引用 3 楼 soaringbird 的回复:
客户端当然不知道有多少个图片,它只是接收图片、应答确认。
循环的是服务端,从图片序列里取一个,发送,等待应答,指定时间内有应答则再取一个发送,没应答则重发,如此循环直至全部发送完成。

发送端是这样写的:先发送图片的长度,然后接收确认;再发送图片的内容,接收确认;然后跳到下一张

                                

ClientSocket.Send(Encoding.ASCII.GetBytes(fileStream.Length.ToString()));

 ClientSocket.Receive(rec);
                                
 ClientSocket.Send(imgByte);
 ClientSocket.Receive(rec);

外面加有for循环 
接收端则对应
byte[] rec_length = new byte[8];
 clientsocket.Receive(rec_length);
 int rec_length_to_int =Convert.ToInt32(System.Text.Encoding.Default.GetString(rec_length).TrimEnd('\0'));
clientsocket.Send(rec_length);
byte[] responseBuffer = new byte[rec_length_to_int];
 clientsocket.Receive(responseBuffer);                        
  Image btmp = BytToImg(responseBuffer);                        
  this.pictureBox1.Image = btmp;
  clientsocket.Send(rec_length);

如果中间出现错误,需要重新传送图片,或者干脆跳过这一张,传送下一张。两者怎么保持同步,重新从最开始的服务器发送图片长度,客户端接受图片长度,依次向下进行。
假如客户端接收图片流时出现问题,clientsocket.Receive(responseBuffer);  这一句有错,致使图片不能显示,后面的回发给服务器的clientsocket.Send(rec_length)不能进行。
此时,服务器中等待接收回应的那一句 ClientSocket.Receive(rec);自然也不能运行。服务器超时之后,选择传下一张,此时客户端仍然在图片显示错误的界面中。客户端如何做到也能跳出这一步,跟服务器保持同步,开始接收下一张图片的长度 --------------------编程问答-------------------- 你这种发送方式太粗放了,怎么也得制定一个协议啊,而且一条数据分两次发送长度和内容,这个也容易出错。
哪怕制定一个简单的协议,比如发送协议: 序号(4字节)长度(四字节)数据区,应答协议:序号(四字节,同收到的序号)结果(一字节,成功或失败),这样的也行啊,再完善点就加上校验啥的 --------------------编程问答-------------------- 如果需要发送其他类型的数据,还可以加上一个数据类型字段
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,