我做一个域网的聊天工具,现在只实现了点对点聊天,(通过服务器发消息的),
想做个文件传输的功能```请问怎么实现呢?(是把文件传到服务器在服务器转发吧???)但是怎么让接受方收到一个接受文件的提示呢?(请教下具体实现步骤,谢谢了)
高手帮忙,要交项目了!!!

解决方案 »

  1.   

    两个方案。
    要么,楼主重新建立一个TCP连接,专用来传输文件。
    要么,楼主自己在原有TCP或UDP协议的基础上,自己定义一套简单的协议。
          用来区分是聊天信息还是文件信息。
      

  2.   

    认同.
    感觉最好是定义一套简单协议,方便以后添加新功能.楼主可以发送文件方向服务器发送请求(最好带一个连接密码,为了确定接收方身份),并做好文件发送准备(建立一个ServerSocket),服务器将文件发送请求与连接密码转发给接收方,然后接收方同意之后与发送方建立连接开始接受文件.如果接收方没有接受则应该设置一个发送方应该设置一个等待超时事件用来关闭相应资源.
      

  3.   

    当然不容易咯。不过再怎么不容易,也要比用C语言要简单多了。
    传文件最好还是使用FTP或HTTP,如果条件不允许,再考虑用TCP协议,如果还不行,再考虑UDP协议。
    向楼主的这种情况,比较棘手,用什么协议,都会有麻烦的地方。
    我提的两种方案,都有麻烦之处,而且,还是后一种方案比较好一些。
    但是,原来的程序可能有70%以上的代码,需要重构。
      

  4.   

    怎么在原来的基础上定义一套简单的协议啊?现在我客户端发文件的时候服务器的转发文件的线程还是收不到,
    我贴点代码上来,高手帮帮忙,急死了现在,    public ServerSocket ss = null;
        Socket s = null;
        //保存所有客户端的连接
        static ArrayList<Chat> userInfo = new ArrayList<Chat>();
        boolean started = false;
    public class Start implements Runnable{
        public void run(){
        try {
                ss = new ServerSocket(1080);
                //ServerSocket sFile = new ServerSocket(1081);
                started = true;
            }catch(BindException e){
               ServerFrame.txtarea.setText(ServerFrame.txtarea.getText()+"该端口已被使用了,请关闭相关程序再运行!"+"\n");
            }catch(IOException e){
                e.printStackTrace();
            }
            try{
               //只有当服务器成功开启后,才不断接受来自客户端的连接
                while (started) {
                   s = ss.accept();
                   BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                   String str=br.readLine();//客户端连接的时候告诉服务器我是谁
                   ServerFrame.txtarea.setText(ServerFrame.txtarea.getText()+str+"连接成功!"+"\n");
                    /*当客户端连接成功后,为每个连接设置一个单独的线程,处理收发信息*/
                   Chat c = new Chat(s,str);//处理消息转发的类
                   userInfo.add(c);
                   new Thread(new SendFile()).start();//发文件的线程
                   new Thread(new UpDateOnlineUser(c)).start();//监听该用户的在线情况
                     new Thread(c).start();//处理收发信息
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        }发送文件和发送消息的线程内容差不多```都是建立IO流向指定在线客户转发这是发送文件按纽的一个内部类
    new MouseListener(){
             public void mouseClicked(MouseEvent e){//鼠标单击
                chooser = new JFileChooser("f:");
                  int result = chooser.showOpenDialog(frame);
                  if(result == JFileChooser.APPROVE_OPTION){
                   File file = chooser.getSelectedFile();
                   String fileUrl = file+"";
                   String[] strAry = fileUrl.split(":");//这前面获得文件路径
                   try{
                   File srcfile=new File(strAry[0]+":"+"\\"+strAry[1]);
                   FileReader fr=new FileReader(srcfile);//建立文件读写流
         BufferedReader br=new BufferedReader(fr);
         sbw = new BufferedWriter(new OutputStreamWriter(sFile.getOutputStream()));
         while(true){
         String str = br.readLine();
         System.out.println("send:"+str);
         if(str == null){
         break;
         }
         bw.write(str);
         bw.newLine();
         bw.flush();
         }
    //      bw.close();
    //      br.close();
    //      fr.close();
         System.out.println("复制完成");
                   }catch(Exception ex){
                   ex.printStackTrace();
                   }              
                  }
             }
    //按回车键,通过输出流向服务器发送消息发送消息
            public void actionPerformed(ActionEvent e) {
                String info = txtshu.getText();
                String str ="";
                txtshu.setText("");
                try {
                    bw.write(info);
                    bw.newLine();
                    bw.flush();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                DateFormat df = new SimpleDateFormat("hh:mm:ss");
                txtarea.setText(txtarea.getText()+user+"  "+df.format(new Date())+"\n"+"   "+info+"\n");
            }麻烦高手帮帮忙,实在好急```
    现在我这情况怎么实现文件传输???
      

  5.   

    重新建立一个TCP连接,专用来传输文件?是不是到服务器里面再定义一个ServerSocket
    ss = new ServerSocket(1080);//聊天的TCP连接
    ss1 = new ServerSocket(1081);//传文件的TCP连接
    s = ss.accept();
    s_File = ss1.accept();//然后用这个建立传文件的IO流转发文件
    客户端:
    s = new Socket("localhost",1080);
    sock_File = new Socket("localhost",1081);//客户端用这个建立IO流向服务器写文件
    是这样的吗?这样客户端发文件就不会被服务器的转发消息的线程给接受了是吗?自己在原有TCP或UDP协议的基础上,自己定义一套简单的协议。 
    用来区分是聊天信息还是文件信息?
    这该怎么实现呢?
    怎么在原来的TCP协议基础上再定义一套简单的协议啊?麻烦详细说一下,
    最好能给点简单定义协议的代码,我还新手,好东西都不知道!
    麻烦各位了!