(接上贴)c# 在 socket通信中,多客户端与一个服务器端异步通信时,传图片没有问题,但两台客户端同时要求传视频会卡死,怀疑是数据发送与接收的问题,求赐教~

u010684484 2013-07-15 12:51:01
(接上一帖)

小弟新人,初来报道,求各位大神指导~~

最近在做一个课设,是有关C#中socket异步通信的,要求两台以上客户端向服务器端请求传送图片和视频信息,服务器端在接到请求后分别向每个客户端发送它们需要的信息,经调试,已解决连接问题,但在传输时却发现,两台客户端同时要求传视频时会出现客户端卡死的现象,而主机仍在传送,客户端得到的图片应该为顺序排列下来的,却在卡死的位置处的图片连同后面传来的图片接到了一个图片中,产生了一个很大的图片(一个上兆的图片,按理一张应为十几K)。故猜测:客户端接收数据出了问题,我们用的是MemoryStream来接受数据,但网上说socket通信中主要用NetworkStream来接受数据,故请教各位大牛,问题是不是出在这里??

附上server端发送数据代码:


public void SendFile(Socket s, string filename)
{
FileInfo fi = new FileInfo(filename);
byte[] len = BitConverter.GetBytes(fi.Length);
//首先把文件长度发送过去
s.BeginSendFile(filename,len,null,TransmitFileOptions.UseDefaultWorkerThread,new AsyncCallback(SendFileCallback),null);
}

public void SendFileCallback(IAsyncResult iar)
{
clientSocket.EndSendFile(iar);
lstServer.Items.Add(DateTime.Now + "The pic\"" + path + "\" has been SENT....");
}


客户端接受数据代码:

public void BeginReceive()//调用此函数 接收文件的开始工作
{
byte[] buffer = new byte[8];
//由于long占8位字节,所以先获取前8位字节数据
IAsyncResult iar = client.BeginReceive(
buffer,
0,
buffer.Length,
SocketFlags.None,
null,
null);
int len = client.EndReceive(iar);
int offset = 0;
int length = BitConverter.ToInt32(buffer, offset); //先获取文件长度
ReceiveFile(length);
BeginReceive(); //继续接收
}

public void ReceiveFile(long filelen)
{
MemoryStream ms = new MemoryStream();
int bytesRead = 0;
long count = 0;
long filelen1 = filelen;
int filelen2 = (int)filelen1;
byte[] buffer = new byte[filelen2];
i+=1;
string i1 = Convert.ToString(i);
string fileNameTime = DateTime.Now.ToString("yyyyMMddhhmmss");
string filenameuse = i1+"-"+fileNameTime ;

while (count != filelen)
{
if (!Directory.Exists("pics/"))//如果不存在该文件夹 也就是被删掉了 就先建一个
{
System.IO.Directory.CreateDirectory("pics/");
}
bytesRead = client.Receive(buffer, buffer.Length, 0);
ms.Write(buffer, 0, bytesRead);
count += bytesRead;
if (count == bytesRead)//写进去文件夹
{
FileStream fs2 = new FileStream("pics/"+filenameuse + ".jpg", FileMode.Create);
BufferedStream bs2 = new BufferedStream(fs2);
fs2.Write(buffer, 0, bytesRead);
fs2.Flush();
fs2.Close();
}
else
{
FileStream fs2 = new FileStream("pics/"+filenameuse + ".jpg", FileMode.Append);
BufferedStream bs2 = new BufferedStream(fs2);
fs2.Write(buffer, 0, bytesRead);
fs2.Flush();
fs2.Close();
}

}

pictureBox1.ImageLocation = "pics/" + filenameuse + ".jpg";

}




还请各位大牛不吝赐教~~小弟这边十分感谢!!!
...全文
301 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010684484 2013-07-15
  • 打赏
  • 举报
回复
引用 8 楼 xiaozhi_5638 的回复:
有什么帮得上的 博客园留个言
好滴~~谢大哥~~
请叫我卷福 2013-07-15
  • 打赏
  • 举报
回复
有什么帮得上的 博客园留个言
u010684484 2013-07-15
  • 打赏
  • 举报
回复
引用 6 楼 xiaozhi_5638 的回复:
tcp中 除了服务端的侦听socket外(就是需要bind、listen、accept) 其余都是成对出现的 与udp的不同点之一
大哥,十分感谢您指点,陪我们也耗了快一天,十分感谢,以后有什么问题还能不能继续问你啊?能不能留个联系的方式,QQ号或邮箱什么的。。。 再次感谢~~
请叫我卷福 2013-07-15
  • 打赏
  • 举报
回复
tcp中 除了服务端的侦听socket外(就是需要bind、listen、accept) 其余都是成对出现的 与udp的不同点之一
请叫我卷福 2013-07-15
  • 打赏
  • 举报
回复
引用 4 楼 u010684484 的回复:
[quote=引用 2 楼 xiaozhi_5638 的回复:] tcp中 接收到的数据不能直接使用 因为它是以“流”格式传过来的 一次接受的数据可能不是一个完整的包 你需要将接收到的数据写入一个缓冲区 然后再循环从缓冲区中检测完整的数据包 因此 你还要自定义一个协议 还有上一贴中 你没搞清楚服务端跟客户端的关系 服务端侦听到客户端socket后 都会有对应的socket与之对应 参见上一贴中的 #6楼 画一张大概的结构图:
您好! 好想拜你为师啊~~~ 我就是不知道这种每个client1、client2、之类的对应他们自己的socket1、socket2这段代码怎么写,一直在想是要用循环还是套接字类型的数组去存储呢?。。。[/quote] 1.这些socket1、socket2就是你Accept或者EndAccept返回来的; 2.无论你用什么方式侦听客户端socket连入(while循环也好、BeginAccept异步编程也好) ,本质上都是循环; 3.可以存放在集合等容器中,需要考虑该集合线程安全。 参见 http://www.cnblogs.com/xiaozhi_5638/archive/2013/07/02/3167794.html以及后一篇关于udp的 tcp我没写
u010684484 2013-07-15
  • 打赏
  • 举报
回复
引用 2 楼 xiaozhi_5638 的回复:
tcp中 接收到的数据不能直接使用 因为它是以“流”格式传过来的 一次接受的数据可能不是一个完整的包 你需要将接收到的数据写入一个缓冲区 然后再循环从缓冲区中检测完整的数据包 因此 你还要自定义一个协议 还有上一贴中 你没搞清楚服务端跟客户端的关系 服务端侦听到客户端socket后 都会有对应的socket与之对应 参见上一贴中的 #6楼 画一张大概的结构图:
您好! 好想拜你为师啊~~~ 我就是不知道这种每个client1、client2、之类的对应他们自己的socket1、socket2这段代码怎么写,一直在想是要用循环还是套接字类型的数组去存储呢?。。。
宸瑞-疾风 2013-07-15
  • 打赏
  • 举报
回复
1.服务器发送未分片。丢包率要逆天 2客户端接受没有缓冲。不卡死才怪 3。接受buff过小
请叫我卷福 2013-07-15
  • 打赏
  • 举报
回复
tcp中 接收到的数据不能直接使用 因为它是以“流”格式传过来的 一次接受的数据可能不是一个完整的包 你需要将接收到的数据写入一个缓冲区 然后再循环从缓冲区中检测完整的数据包 因此 你还要自定义一个协议

还有上一贴中 你没搞清楚服务端跟客户端的关系 服务端侦听到客户端socket后 都会有对应的socket与之对应
参见上一贴中的 #6楼

画一张大概的结构图:
u010684484 2013-07-15
  • 打赏
  • 举报
回复
求助啊~~自己顶一下~~

110,539

社区成员

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

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

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