黑马程序员技术交流社区

标题: 论坛求助...套接字聊天室发送文件问题 [打印本页]

作者: 许波    时间: 2012-9-15 17:33
标题: 论坛求助...套接字聊天室发送文件问题
套接字聊天室,客户端/服务端发送文字信息都没问题,就是客户端向服务端发送文件数据的时候客户端不弹出选择保存位置弹框

客户端选择文件代码也没问题,路径显示什么都挺正常,就是选择好发送的文件以后点击发送,服务端没有反应...先付上客户端向服务端发送文件的代码段
  1. //向服务端发送文件
  2. private void btnSendFile_Click(object sender, EventArgs e)
  3. {
  4. //用文件流打开 用户选择的 文件
  5. using(FileStream fs=new FileStream(txtFilePath.Text,FileMode.Open))
  6. {
  7. byte[] arrFile=new byte[1024*1024*2];//定义一个2M的数组(缓存区)
  8. //将文件数据读到数组arrFlie中,并获得读取的真实数据长度length
  9. int length=fs.Read(arrFile, 0, arrFile.Length);
  10. byte[] arrFileSend = new byte[length + 1];
  11. arrFileSend[0] = 1;//1代表发送的是文件数据
  12. //将arrFile数组里的元素 从第0个拷贝,拷贝到arrFileSend数组里,从第1个位置开始存放,一共存放length个数据
  13. Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length);
  14. //发送包含了标识位的新数据数组到服务端
  15. socketclient.Send(arrFileSend);
  16. }
复制代码
然后是服务端接收段的方法代码
  1. void RecMsg(object socketclientpara)
  2. {
  3. Socket socketclient = socketclientpara as Socket;
  4. while (true)
  5. {
  6. //定义一个接收用的缓存区(2M字节数组)
  7. byte[] arrmsgrec = new byte[1024 * 1024 * 2];
  8. //将接收到的数据存入arrmsgrec数组,并返回真正接收到的数据的长度
  9. int length = socketclient.Receive(arrmsgrec);
  10. if (arrmsgrec[0] == 0)//判断发送过来的数据第一个元素是0,则发送过来的是文字数据
  11. {

  12. string strmsgrec = System.Text.Encoding.UTF8.GetString(arrmsgrec, 1, length-1);
  13. ShowMsg(strmsgrec);
  14. }
  15. else if (arrmsgrec[0] == 1)//如果是1,则代表发送过来的是文件数据(图片/视频/文件...)
  16. {
  17. SaveFileDialog sfd = new SaveFileDialog();//保存文件选择框对象
  18. if(sfd.ShowDialog()==System.Windows.Forms.DialogResult.OK)//用户选择文件路径后
  19. {
  20. string fileSavePath = sfd.FileName;//获得要保存的文件路径
  21. //创建文件流,然后让文件流来 根据路径 创建一个文件
  22. using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
  23. {
  24. fs.Write(arrmsgrec,1, length-1);
  25. ShowMsg("文件保存成功:" + fileSavePath);
  26. }
  27. }
  28. }
  29. }
  30. }
复制代码
迷糊了...琢磨半天没琢磨明白



作者: 李后量    时间: 2012-9-15 17:54
我也遇到过一样的问题,参考我上次提问题时别人给的答案吧,解决了http://bbs.itheima.com/thread-25244-1-1.html
作者: 许波    时间: 2012-9-15 19:02
李后量 发表于 2012-9-15 17:54
我也遇到过一样的问题,参考我上次提问题时别人给的答案吧,解决了http://bbs.itheima.com/thread-25244-1- ...

晕哦 ,解决了
  1. ParameterizedThreadStart pts = new ParameterizedThreadStart(RecMsg);
  2.                 Thread thr = new Thread(pts);
  3.                 thr.SetApartmentState(ApartmentState.STA);
  4.                 thr.IsBackground = true;
  5.                 thr.Start(sokConnection);
复制代码
看了一个其他人的帖子说是WIN7的问题...  额 ,MTA STA真是学到了..




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2