A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李后量 于 2012-9-11 18:40 编辑

正如视频里的那样,我做了一下聊天室小程序,只是我是从服务端发往客户端的,但运行的时候出现了发送文件成功但接收不了文件的现象。
经过调试,发现从服务端发送没有问题,但在客户端接收的时候出现了这个问题:调试到弹出保存文件窗口 的时候程序就是不弹出那个SaveFileDialog 窗口~~~纠结了

调试图片:


当再次按下F11的时候客户端窗口就弹出来了,而不是理论上的保存文件窗口SaveFileDialog。

下面是客户端接收端代码
  1. void RecMsg()
  2.         {
  3.             while (true)
  4.             {
  5.                 //定义一个用来接收数据的缓冲区(2M的字节数组)
  6.                 byte[] byteRecMsg = new byte[1024 * 1024 * 2];
  7.                 //将接收到的数据存入byteRecMsg中,并返回字节长度
  8.                 int length= socketClient.Receive(byteRecMsg);
  9.                 if (byteRecMsg[0] == 0)
  10.                 {
  11.                     //把从数组的第一个元素开始拿数据,一直到最后一个不为空的元素,然后进行转换
  12.                     string strRecMsg = System.Text.Encoding.UTF8.GetString(byteRecMsg, 1, length-1);
  13.                     ShowMsg("对方说:" + strRecMsg);
  14.                 }
  15.                 else if (byteRecMsg[0] == 1)
  16.                 {
  17.                     SaveFileDialog sfd = new SaveFileDialog();
  18.                     sfd.ShowDialog();
  19.                     if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  20.                     {
  21.                         string fileSavePath = sfd.FileName;
  22.                         using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
  23.                         {
  24.                             fs.Write(byteRecMsg, 1, length - 1);
  25.                         }
  26.                         ShowMsg("文件保存成功:" + fileSavePath);
  27.                     }
  28.                 }
  29.             }
  30.         }
复制代码
下面是服务端发送文件的代码
  1. private void btnSendFile_Click(object sender, EventArgs e)
  2.         {
  3.             using (FileStream fs = new FileStream(txtFilePath.Text,FileMode.Open))
  4.             {
  5.                 byte[] arrFile = new byte[1024 * 1024 * 2];
  6.                 int length= fs.Read(arrFile, 0, arrFile.Length);
  7.                 byte[] sendFile = new byte[length+1];
  8.                 sendFile[0] = 1;
  9.                 Buffer.BlockCopy(arrFile, 0, sendFile, 1, length);
  10.                 string strClientKey = lbOnLine.Text;
  11.                 dic[strClientKey].Send(sendFile);
  12.                 ShowMsg("文件发送成功!");
  13.             }
  14.         }
复制代码
大牛们帮看看这是肿么了~~~~


评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

8 个回复

倒序浏览
本帖最后由 李京 于 2012-9-10 08:15 编辑
  1.     // 打开保存文件的对话框
  2.     saveFileDialog = new SaveFileDialog();

  3.     // 设置默认保存的文件名
  4.     saveFileDialog.FileName = strout;
  5.     saveFileDialog.ShowDialog();

复制代码
添加了一个设置文件名的代码

你可以去
看看这个网站。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
sfd.ShowDialog();//把客户端接收端代码的这行语句注释掉,然后再重新编译运行一下
回复 使用道具 举报
许庭洲 发表于 2012-9-10 08:17
sfd.ShowDialog();//把客户端接收端代码的这行语句注释掉,然后再重新编译运行一下 ...

本来是没那句的,但后来我实在不知道为啥了才加的那句,可加了之后还是不行~~~
回复 使用道具 举报
本帖最后由 黑马杨凯 于 2012-9-11 13:46 编辑

首先你使用一个线程去不停的接收消息,你创建线程时,在不设定ApartmentState时,默认是MTA多线程单元,而这里你想打开一个保存文件对话框,这一控件支持的是STA单线程单元,所以你需要将你的线程在使用前ApartmentState设定为STA模式(很多的控件都是支持STA模式)

  Thread th=new Thread(...);
   th.SetApartmentState(ApartmentState.STA);
   th.Start();

你通过将winform 程序反编译,可以看到程序入口点main()上面有一个标记[STAThread],也就是说,主线程是STA模式,而它使用的控件肯定是能支持STA模式的,但是不是只支持STA就不清楚了,常用的MessageBox,会弹出一个消息框,这个好像就什么线程都可以用的。
回复 使用道具 举报
你通过断点调试的时候,当程序执行到new SaveFileDialog()的时候,其实已经弹出了一个保存对话框,但是没有反应到你的桌面上,这是你会发现继续按F11没有作用,是因为保存对话框在等待你的操作。
此时,你只要Alt+Tab切换一下就行了,在切换的窗口中,有一个没有描述的切换项,这个就是你new出来的保存对话框。
回复 使用道具 举报
黑马杨凯 发表于 2012-9-11 13:33
首先你使用一个线程去不停的接收消息,你创建线程时,在不设定ApartmentState时,默认是MTA多线程单元,而 ...

果然,大牛就是大牛啊,这是为什么啊?为什么视频里老师没这么做就可以成功而我就得这么折腾一下才行呢?给俺讲讲呗
回复 使用道具 举报
本帖最后由 黑马杨凯 于 2012-9-11 21:08 编辑
李后量 发表于 2012-9-11 18:39
果然,大牛就是大牛啊,这是为什么啊?为什么视频里老师没这么做就可以成功而我就得这么折腾一下才行呢? ...

呵呵,我可不是高手,我也才学编程不久,我看视频练习的时候做过,也遇到了这个问题,记得查过不少资料,所以才知道一点罢了,线程这块,我也还没学明白,其实相关的东西可以用关键词再csdn博客或者博客园吧搜索一下,里面的博文真的很棒,那些才是真正的高手啊。
回复 使用道具 举报
黑马杨凯 发表于 2012-9-11 20:54
呵呵,我可不是高手,我也才学编程不久,我看视频练习的时候做过,也遇到了这个问题,记得查过不少资料,所 ...

多了解些就是高手啊,一起学习!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马