黑马程序员技术交流社区

标题: 聊天室中能否又服务端向客户端发送文件 [打印本页]

作者: 徐阳    时间: 2012-8-31 11:35
标题: 聊天室中能否又服务端向客户端发送文件
这是代码,我学着老师的视频想先从服务端调试向客户端发送文件,然后想试着,从客户端向客户端发送文件。可是才刚刚开始就遇到困难。从服务端向客户端发送文件不成功。

ChatRoom.zip

96.82 KB, 下载次数: 213


作者: 许庭洲    时间: 2012-8-31 14:25
【分享】服务器端向客户端发送消息,客户端接收消息

         //通过IP地址和端口创建网络节点对象
          IPAddress address=IPAddress.Parse(服务器Ip地址);
          IPEndPoint endpoint=new IPEndPoint(address,int.Parse(端口));

          //创建一个套接字(工具,固定代码)
          Socket socketWatch =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

           //将套接字绑定到唯一的网络节点上
           socketWatch.Bind(endpoint);

           //设置监听队列长度
           socketWatch.Listen(10);

          //创建一个Dictory<string,Socket> 用来存储所有与服务器通信的套接字
          Dictory<string,Socket> dic=new Dictory<string,Socket>;

         //通过线程为每一个与之连接的客服端分配一个Socket对象:
         Thread threadWatch=new Thread(WatchConnecting);//创建负责监听的线程,并传入监听方法
         threadWatch.IsBackground=true;//设置为后台线程
         threadWatch.Start();//开启线程
   
          //获取与要发送信息的客户端套接字,并调用方法发送消息
          string strMsg="要发送的消息";
          byte[] arrMsg=System.Text.Encoding.UTF8.GetBytes(strMsg);
          dic[lbOnline.Text].Send(arrMsg);//从lbOnline控件中取得网络节点信息,并从套接字集合里获得客户端套接字
         
          //创建监听方法   
         void WatchConnecting()
         {
                while(true)
               {
                       //开始监听,一旦监听到客户端的连接请求,就分配一个与之对应的通信套接字
                       Socket sokConnection=socketWatch.Accept();

                      //将每一个通信套接字存入Dictory<string,Socket> dic
                      dic.Add(sokConnection.RemoteEndPoint.ToString(),socketWatch);

                     //将sokConnection的客户端网络节点保存到一个容器里面,假设有一个listBox lbOnline
                     lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
                    MessageBox.showDialog("有新的客户端成功连接!");
         }

   

作者: 徐阳    时间: 2012-8-31 15:00
许庭洲 发表于 2012-8-31 14:25
【分享】服务器端向客户端发送消息,客户端接收消息

         //通过IP地址和端口创建网络节点对象

老师,您好,我要提的问题可能被我弄的很难理解,其实是,当我发送文件时,另外一端接收不了文件,不会弹出那个保存文件的窗口
作者: 徐阳    时间: 2012-8-31 15:12
原来是WIN7搞的鬼,设置一下线程就好。还好有前辈遇到过这个问题,设置线程
thr.SetApartmentState(ApartmentState.STA);
作者: 许庭洲    时间: 2012-8-31 15:13
徐阳 发表于 2012-8-31 15:12
原来是WIN7搞的鬼,设置一下线程就好。还好有前辈遇到过这个问题,设置线程
thr.SetApartmentState(Apartme ...

是吧!太有才了。




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