(接上贴)c# 在 socket通信中,多客户端与一个服务器端异步通信时,传图片没有问题,但两台客户端同时要求传视频会卡死,怀疑是数据发送与接收的问题,求赐教~
本帖最后由 u010684484 于 2013-07-15 12:53:49 编辑 (接上一帖)
小弟新人,初来报道,求各位大神指导~~
最近在做一个课设,是有关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";
}
还请各位大牛不吝赐教~~小弟这边十分感谢!!!
[解决办法]
1.服务器发送未分片。丢包率要逆天
2客户端接受没有缓冲。不卡死才怪
3。接受buff过小
[解决办法]
您好!
好想拜你为师啊~~~
我就是不知道这种每个client1、client2、之类的对应他们自己的socket1、socket2这段代码怎么写,一直在想是要用循环还是套接字类型的数组去存储呢?。。。
1.这些socket1、socket2就是你Accept或者EndAccept返回来的;
2.无论你用什么方式侦听客户端socket连入(while循环也好、BeginAccept异步编程也好) ,本质上都是循环;
3.可以存放在集合等容器中,需要考虑该集合线程安全。
参见 http://www.cnblogs.com/xiaozhi_5638/archive/2013/07/02/3167794.html以及后一篇关于udp的 tcp我没写