我想实现的效果是把一个文件夹下的文件一个个的发给客户端。
我现在的做法是:1、先发个头标志包括文件的名称大小等信息  2、发送文件  3、发送一个结束标志  
但我现在的问题是:如果在我每发送一个文件就弹出一个messagebox的话,客户端有时只能接收到我发来的其中几个文件。但如果我等到把文件夹下的文件都发过去后再提示,客户端就会一个也收不到。

解决方案 »

  1.   

    恩  代码有问题  应该和弹出messagebox没有关系吧
      

  2.   

    这是我的发送的代码//发送
    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");       
            }
      

  3.   

    这是接收private void ReadCallback(IAsyncResult ai)
            {
                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;
                }
            }我知道我的代码有问题,但不知道该怎么改,高手们指点一下啊
      

  4.   

    你在ReadCallback中去弹出消息框会不会中断传送处理,建议你可以记录一个消息,等到最后再弹出。
    发送端也是一样,不要发送一个就提示,等全部发送完了再提示