用两个线程通过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)肯定是不行,请高手指点!
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)肯定是不行,请高手指点!
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();
}
}