利用socket连接。接到请求的一方建立ServerSocket
发出请求的一方作为客户,建立与ServerSocket的连接。然后客户端开启一个写socket的线程,把本地文件写道Socket的输出流中。在server端开启读线程,从socket的输入流中读取内容保存到本地硬盘

解决方案 »

  1.   

    我想为你写一下,不过我现在要看球了,暂时实现不了跨越proxy功能。
      

  2.   

    我知道用socket实现,传输方先把文件解析成流,接收方再做处理把流还原成文件,不过这个方法比较困难,有没有其他方法啊
      

  3.   

    直接建立连接理论上可以,但现在大多数用户都不是公网IP,要实现QQ文件传输的功能一定要实现proxy转发,不然只能在局域网里试验了。建个转发服务器或许可以。
      

  4.   

    █████████
    █┏━━━━━┓█
    █★          ★█
    █   ☆ up ☆   █
    █          █
    █ 〖初窥Java〗 █
    █ 【虚心学习】 █
    █★          ★█
    █┗━━━━━┛█
    █████████
      

  5.   

    服务器端的。你参考一下吧!package chatbar.filetransmit;import java.io.*;
    import java.net.*;/**
     * <p>Title: This follow is newman's writing</p>
     * <p>Description: I want better writing ,instead of best one!</p>
     * <p>Copyright: Copyright (c) 2002</p>
     * <p>Company: [email protected]</p>
     * @author Newman
     * @version 1.0
     * 
     * 发送端开客户机,接收端开服务器
     */
    public class NetFileTransmitterServer extends Thread{    private int m_nPort =8765;
        private Socket m_sClient=null;    
        private File m_file=null;//file to receive    
        private String m_szFileName="";//file to receive
        private long m_lngFileLength=0;    private PrintStream m_Out=null;    
        private BufferedInputStream m_In=null;
        private String m_szMsg="";//receive message
        //private boolean m_bReady=false;//is Server ready
        private int m_nContentLength=4096;
        private long m_lngTimeStart=0;//起始时间
        private long m_lngFileLengthReceived=0;//文件接收的长度
        
        public NetFileTransmitterServer() {
        }    /**
         * get port to transmit file
         * @return
         */
        public int getPort() {
            return m_nPort;
        }
        
        /**
         * set port to transmit file
         * @param m_nPort
         */
        public void setPort(int m_nPort) {
            this.m_nPort = m_nPort;
        }
        
        /**
         * set file to transmit
         * @param file
         */
        public void setTransmitFile(File file){
            this.m_file =file;
        }
        
        public void run(){
            try {
                ServerSocket ss=new ServerSocket(this.m_nPort);
                System.out.println("Server start...");
                this.m_sClient=ss.accept();
                System.out.println("accept a client."+this.m_sClient.getInetAddress() .getHostName());
        
                this.m_Out=new PrintStream(this.m_sClient.getOutputStream());
                this.m_In=new BufferedInputStream(this.m_sClient.getInputStream());
                BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(this.m_file));
                
                System.out.println("reading data now...");            boolean flag=false;
                byte[]data=new byte[this.m_nContentLength];//信息符 + 数据
                int count=0;            
                
                System.out.println("server is reading data now...");
                this.m_lngTimeStart=System.currentTimeMillis(); 
                while (!flag) {                
                    this.m_szMsg=this.readLine(this.m_In);
                    //System.out.println("Server msg: "+this.m_szMsg);                /**
                     * 控制
                     * QUIT
                     * READY
                     * ROGER
                     *
                     * 文件发送
                     * FILETRANSMITSTART
                     * FILENAME=abc.jpg 
                     * FILELENGTH=8874
                     * FILECONTENT CONTENTLENGTH=1024
                     * sdfjkawena
                     * FILETRANSMITEND
                     */
                    if (this.m_szMsg.startsWith(FileTransmitCommands.QUIT)) {
                        this.m_Out.println(FileTransmitCommands.QUIT);
                        this.m_sClient.close() ;
                        this.m_In.close();
                        flag=true;
                        System.out.println("Server Quit");                    System.out.println("Server time elapse: "+(System.currentTimeMillis()-this.m_lngTimeStart)+",speed: "+this.getSpeed());
                        return;
                    }
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.READY)) {
                        this.m_Out.println(FileTransmitCommands.READY);
                        this.m_Out.println(FileTransmitCommands.ROGER);
                    }
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILETRANSMITSTART)) {//a file
                        this.m_szFileName="";
                        this.m_lngFileLength=0;
                    }
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILENAME)) {
                        int pos=this.m_szMsg.indexOf("=")+1;
                        this.m_szFileName=this.m_szMsg.substring(pos);//文件名
                    }
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILELENGTH)) {
                        int pos=this.m_szMsg.indexOf("=")+1;                    
                        String temp=this.m_szMsg.substring(pos);//文件内容长度
                        try {
                            this.m_lngFileLength=Long.parseLong(temp);
                        }
                        catch (NumberFormatException ex) {
                                ex.printStackTrace();
                        }
                    }                else if (this.m_szMsg.startsWith(FileTransmitCommands.FILECONTENT)) {
                        int pos=this.m_szMsg.indexOf("=")+1;
                        String temp="";
                        temp=this.m_szMsg.substring(pos);//文件内容长度
                        try {
                            this.m_nContentLength=Integer.parseInt(temp);
                            data=new byte[this.m_nContentLength];
                            this.m_In.read(data,0,this.m_nContentLength);                        bos.write(data,0,this.m_nContentLength) ;
                            m_lngFileLengthReceived+=this.m_nContentLength;
                        }
                        catch (NumberFormatException ex) {
                                ex.printStackTrace();
                        }
                    }
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILETRANSMITEND)) {
                        //System.out.println("m_szFileName: "+this.m_szFileName);
                        System.out.println("file parse end");
                    }
                }            
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        }    /**
         * get speed
         * @return
         */
        public long getSpeed(){
            return this.m_lngFileLength/(System.currentTimeMillis()-this.m_lngTimeStart);
        }
        
        public String readLine(InputStream is) throws IOException {
    StringBuffer result=new StringBuffer ();    
    boolean finished=false;
    boolean isenter=false; while(!finished){
    int ch=-1;
    ch=is.read();

    if((isenter)&&(ch==10)){// if it is "\n\r"
    result.setLength(result.length()-1);//had added "\n",remove it
    return result.toString ();
    }

    if(ch==13)//if enter pressed
    isenter=true;
    else
    isenter=false; if(ch==-1)//end
    return result.toString ();
    else 
    result.append ((char)ch);
    }
    return result.toString ();
    }    public static void main(String[] args) throws Exception{
            NetFileTransmitterServer server=new NetFileTransmitterServer();
            //server.setTransmitFile(new File("TransmitFile_test.txt"));
            server.setTransmitFile(new File("math.chm"));
            server.start() ;
        }
    }
      

  6.   

    回:newman0708(nch) 不知道你用的是什么工具运行这个程序的,我在JCREATOR里面运行了一下,总是出错,
    错语是
    D:\network\NetFileTransmitterServer.java:96: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    if (this.m_szMsg.startsWith(FileTransmitCommands.QUIT)) {
                                                ^
    D:\network\NetFileTransmitterServer.java:97: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                        this.m_Out.println(FileTransmitCommands.QUIT);
                                           ^
    D:\network\NetFileTransmitterServer.java:106: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.READY)) {
                                                     ^
    D:\network\NetFileTransmitterServer.java:107: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                        this.m_Out.println(FileTransmitCommands.READY);
                                           ^
    D:\network\NetFileTransmitterServer.java:108: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                        this.m_Out.println(FileTransmitCommands.ROGER);
                                           ^
    D:\network\NetFileTransmitterServer.java:110: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILETRANSMITSTART)) {//a file
                                                     ^
    D:\network\NetFileTransmitterServer.java:114: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILENAME)) {
                                                     ^
    D:\network\NetFileTransmitterServer.java:118: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILELENGTH)) {
                                                     ^
    D:\network\NetFileTransmitterServer.java:129: 不能解析符号
    符号:变量 FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILECONTENT)) {
                                                     ^
    D:\network\NetFileTransmitterServer.java:145: 不能解析符号
    符号:变??FileTransmitCommands  
    位置:类 in chatbar.filetransmit.NetFileTransmitterServer
                    else if (this.m_szMsg.startsWith(FileTransmitCommands.FILETRANSMITEND)) {
                                                     ^
    是不是FileTransmitCommands没有定义呀?