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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  void RecMsg(object socketClientPara)
        {
            Socket socketClient = socketClientPara as Socket;
            while (true)
            {
                //定义一个接收用的 缓存区(2M字节数组)
                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
                //将接收到的数据存入arrMsgRec数组,并返回真正接收到的数据的长度
                int length = socketClient.Receive(arrMsgRec);
                //第0个元素如果是0的话代表是文字
                if (arrMsgRec[0] == 0)
                {
                    //此时是将数组所有的元素都转换成字符串,而真正接收到的只有服务端发来的几个字符
                    string strMsgRec = Encoding.UTF8.GetString(arrMsgRec, 0, length);
                    ShowMessage(strMsgRec);
                }
                   //如果是1,则代表发送过来的是文件数据(图片、视频、文件....)
                else if(arrMsgRec[0]==1)
                {
                    SaveFileDialog sfd = new SaveFileDialog();//保存文件选择框对象
                    if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        string fileSavePath = sfd.FileName;//获得要保存的文件路径
                        //创建文件流,然后让文件流来根据路径创建一个文件。
                        using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
                        {
                            fs.Write(arrMsgRec, 1, length-1);
                            ShowMessage("文件保存成功:"+fileSavePath);
                        }
                        }
                }
            }
        }

1.jpg (158.21 KB, 下载次数: 0)

检查代码没有问题呀为什么发送文件后保存对话框不出来呢

检查代码没有问题呀为什么发送文件后保存对话框不出来呢

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

2 个回复

倒序浏览
补充一下问题: 我把代码粘到一个新按钮下可以调出来。
回复 使用道具 举报
哦。这个问题啊。 你在服务端接受文件的线程那里。要改一下   线程名.ApartmentState = ApartmentState.STA;缺少这句话,就会出错误。
比如   void ServerAccept()
        {
            while (true)
            {
                Socket socketConnetion = SocketWatch.Accept();
                dic.Add(socketConnetion.RemoteEndPoint.ToString(), socketConnetion);
                lbendpiont.Items.Add(socketConnetion.RemoteEndPoint.ToString());
                ShowMsg("客户端连接成功" + socketConnetion.RemoteEndPoint.ToString());
                Thread threadSeverRec = new Thread(SeverRecMsg);
                threadSeverRec.SetApartmentState(ApartmentState.STA);
                threadSeverRec.IsBackground = true;
                threadSeverRec.Start(socketConnetion);
                dict.Add(socketConnetion.RemoteEndPoint.ToString(), threadSeverRec);
            
            }
因为在win7系统下。需要这个代码。我也纠结了好久。在网上找了解决方法。http://daociyiyou111.blog.163.com/blog/static/164701512201182104248626/

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马