我想实现的效果是把一个文件夹下的文件一个个的发给客户端。
我现在的做法是:1、先发个头标志包括文件的名称大小等信息 2、发送文件 3、发送一个结束标志
但我现在的问题是:如果在我每发送一个文件就弹出一个messagebox的话,客户端有时只能接收到我发来的其中几个文件。但如果我等到把文件夹下的文件都发过去后再提示,客户端就会一个也收不到。
我现在的做法是:1、先发个头标志包括文件的名称大小等信息 2、发送文件 3、发送一个结束标志
但我现在的问题是:如果在我每发送一个文件就弹出一个messagebox的话,客户端有时只能接收到我发来的其中几个文件。但如果我等到把文件夹下的文件都发过去后再提示,客户端就会一个也收不到。
private void btnSendFile_Click(object sender, RoutedEventArgs e)
{
ArrayList slist = GetSelectedClient();//获取要发送文件的客户端的socket
ArrayList flist = GetMediaFileList("MediaLists.xml");//获取文件列表中的文件
for (int i = 0; i < slist.Count; i++)
{
Socket s = (Socket)slist[i];
for (int j = 0; j < flist.Count; j++)
{
sendFile(flist[j].ToString(), s);//发送文件
Send(s, "<Over>");//发送文件发送结束标志
Thread.Sleep(1000);
}
}
}
//分包发送文件
private void sendFile(string strFileName, Socket s)
{
FileStream fsimg = new FileStream(System.Windows.Forms.Application.StartupPath + "\\" + strFileName, FileMode.Open, FileAccess.Read, FileShare.Read);
int bytesize = 1024;
int TotalLength = (int)fsimg.Length;
int PacketsNum = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(fsimg.Length) / Convert.ToDouble(bytesize)));
int CurrentLeng = 0;
byte[] bytedata = null;
int count = 0;
//头消息内容:标志 文件名 文件大小 包的数量 最后一个包的大小
string strHead = "<PEOF>" + (char)191 + strFileName + (char)191 + TotalLength.ToString() + (char)191 + PacketsNum.ToString() + (char)191 + (TotalLength - (PacketsNum - 1) * bytesize).ToString();
int headLen = strHead.Length;
Send(s, strHead);
for (int j = 0; j < PacketsNum; j++)
{
if (TotalLength > bytesize)
{
CurrentLeng = bytesize;
TotalLength -= bytesize;
}
else
{
CurrentLeng = bytesize;
}
bytedata = new byte[CurrentLeng];
count = fsimg.Read(bytedata, 0, CurrentLeng);
byte[] SendingBuffer = new byte[CurrentLeng];
SendingBuffer = bytedata;
Send(s, SendingBuffer);
}
fsimg.Close();
MessageBox.Show("OK");
}
{
try
{
StateObject stateclient = (StateObject)ai.AsyncState;
Socket client = stateclient.workSocket;
int byteread = client.EndReceive(ai);
if (byteread > 0)
{
string ss = System.Text.Encoding.UTF8.GetString(stateclient.buffer);
ss = ss.Substring(0, 6);
TreateRecv(ss, stateclient, byteread);
stateclient.SetBuffer();
client.BeginReceive(stateclient.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), stateclient);
}
}
catch { }
}
//处理接收的内容
private void TreateRecv(string strf, StateObject stateclient, int byteread)
{
switch (strf)
{
case "<PEOF>"://接收文件头标志
HeadMsg = System.Text.Encoding.UTF8.GetString(stateclient.buffer, 0, byteread);
string[] sss = HeadMsg.Split((char)191);
FileName = sss[1].ToString();
intP = Convert.ToInt32(sss[3].ToString());
break;
case "<MEOF>": //接收消息
HeadMsg = System.Text.Encoding.UTF8.GetString(stateclient.buffer, 0, byteread);
SetText(HeadMsg);
break;
case "<WEOF>"://接收消息
HeadMsg = System.Text.Encoding.UTF8.GetString(stateclient.buffer);
SetText(HeadMsg);
break;
default://对文件进行处理
ms.Write(stateclient.buffer, 0, byteread);
intPacknum += 1;
break;
}
if (strf == "<Over>")
{
SetFile();
ms.Dispose();
ms = new MemoryStream();
MessageBox.Show("应收到包的数量:" + intP + "实际收到包数:" + intPacknum);
intPacknum = 0;
}
}我知道我的代码有问题,但不知道该怎么改,高手们指点一下啊
发送端也是一样,不要发送一个就提示,等全部发送完了再提示