用两个线程通过socket实现文件的复制确实可以,如下:
while(true)
{
Client=Server.accept();
new writeFile(Client).start();
}                class writeFile extends Thread
{
......
In=Client.getInputStream();
In.read(b);
FileOut.write(b);
......
  }
但是为什么需要两个线程呢,是不是如果将写文件(也就是writeFile类的内容)放到while循环中就会耽搁时间导致发送过来的字节server.accept()无法监听,我尝试了,只要放到while循环中肯定失败,还有,如何能让字节接受完成后让while循环能退出呢,while(In.read(b)!=-1)肯定是不行,请高手指点!

解决方案 »

  1.   

    Socket本身就相当于一个数据流啊
      

  2.   

    //服务端程序
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.*;//FileReceive类用不用线程不要紧。程序中避病很多,自己去改进吧。
    //也可以用RMI来实现(有好也有坏的因素)
    public class FileReceive extends Thread
    {
        ServerSocket ssocket = null;    public FileReceive()
        {
        }    public void run()
        {
            Socket socket = null;
            try
            {
                ssocket = new ServerSocket(6530);
                while (true){
                socket =ssocket.accept(); //等待客户连接
                writeFile mt=new writeFile(socket);
                mt.start();
                Thread.sleep(3000);//让出cpu给其它线程使用
                }
                }catch(Exception e){}
                finally{
                    try{
                    ssocket.close();
                    socket.close();
                    }catch(Exception e){}
                }
        }    public static void main(String[] args)
        {
            FileReceive fileRead1 = new FileReceive();
            fileRead1.start();
        }
    }import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.*;public class writeFile extends Thread
    {
        Socket socket = null;    public writeFile(Socket pSocket)
        {   this.socket = pSocket;  }    public void run() {
            try{
                ObjectInputStream dis = new ObjectInputStream(socket.getInputStream());
                FileOutputStream fos = new FileOutputStream("c:\\writeFile.java");
                byte[] filebyte = (byte[])dis.readObject();
                for(int i=0 ; i <filebyte.length ; i++){
                    fos.write(filebyte[i]);
                }
                fos.close();
                dis.close();
                socket.close();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    ////////////////客户端程序
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.*;public class FileSend
    {    public FileSend()
        {
            try{
                Socket socket = new Socket("127.0.0.1",6530);
                ObjectOutputStream ois = new ObjectOutputStream(socket.getOutputStream());
                File file = new File("E:\\work\\csdn\\src\\csdn\\socket\\writeFile.java");
                FileInputStream fos = new FileInputStream(file);
                byte[] filebyte = new byte[(int)file.length()];
                fos.read(filebyte,0,(int)file.length());
                ois.writeObject(filebyte);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        public static void main(String[] args)
        {
            FileSend fileSend1 = new FileSend();
        }
    }
      

  3.   

    cja106,谢谢你对我的帮助,我觉得你的这段程序中的那个Thread.sleep(3000)用的非常经典