package wei.guo.fileTransportation.ServerAndClient;import java.io.IOException;
import java.net.ServerSocket;import wei.guo.fileTransportaion.bean.User;public class FileReceiver  extends Thread
{

    private ServerSocket ss = null;    
    //文件传输的监听端口
    private int FILE_PORT;
    private User user = null;
    private String savePath = "";
    public  FileReceiver(User user)
    {
     //设置文件端口
     this.user = user;
        this.FILE_PORT = user.getPort();
        this.savePath = "F://";
    }
    public void run()
    {
        try
        {
            ss = new ServerSocket(FILE_PORT);
            System.out.println("用户端开始监听:"+ss);
            while(true)
                {
                java.net.Socket  socket = ss.accept();
                System.out.println("连接接受"+socket);
                new FileReceiverThread(user,socket,savePath);
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(java.lang.Exception ex)
        {
            System.err.println(ex.getMessage().toString());
            ex.printStackTrace();
        }
        finally
        {
            try 
            {
                ss.close();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }    
    }
    
    public static void main(String[] args){
     User user = new User("127.0.0.1",6655,"1234332");
     FileReceiver fr = new FileReceiver(user);
     fr.start();
     System.out.println("...........................");
    
    }
}
package wei.guo.fileTransportation.ServerAndClient;import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;import wei.guo.fileTransportaion.bean.User;public class FileReceiverThread extends Thread
{
    
    private java.net.Socket socket = null;
    //从客户端读数据的
    private java.io.DataInputStream in = null;
    //向客户端写数据
    private java.io.DataOutputStream out = null;
    private String savePath = "";
    private User sender =null;
    private User receiver =null;
    private FileOutputStream fos = null;
        public FileReceiverThread (User user,Socket socket,String savePath)
    {
        this.receiver=user;
        this.socket = socket;
        this.savePath = savePath;
        try {
this.in = new DataInputStream(this.socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
        
        //启动线程
        this.start();
    }    public void run()
    {
     //传输前时间
     Date before = new Date();
     //文件名接收
        String fileName = null;
try {
fileName = in.readUTF();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        System.out.println("文件名:"+fileName);
        //文件大小接收
        long size = 0;
try {
size = in.readLong();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        System.out.println("文件大小:"+size);
        //文件接收
        savePath += fileName;
        File file = new File(savePath);
        try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        byte[] buf = new byte[1024*1000];
        int read = 0;
        System.out.println("准备开始接收文件!\n");
        try {
while(in.read(buf)!=-1){
System.out.println(buf);
//fos.write(buf);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        System.out.println("文件成功传输完成!\n");
        
        Date after = new Date();
        long time = (after.getTime()-before.getTime())/1000;
        System.out.println("文件传输共计用时:"+time+"秒"+"\n");
        
        //关闭并释放流连接和Socket连接
        try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        try {
this.socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        

    }
}package wei.guo.fileTransportation.ServerAndClient;import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;import wei.guo.fileTransportaion.bean.User;public class FileSender extends Thread
{   
//客户端socket
    private Socket socket = null;
    //向服务器写数据
    private DataOutputStream out = null;
    //文件输入流
    private DataInputStream dis = null;
    //要传输的文件
    private File fileToSend = null;
    //用户对象e
    private User receiver = null;
    //传输端口
    private int port = 0;
    //接收者IP
    private String IP = "";
    public FileSender(File file,User user)
    {
        this.fileToSend = file;
        this.receiver = user;
        port = user.getPort();
        IP = user.getIP();
        
    }    public void run()
    {
     try 
        {
            this.socket = new Socket(IP,port);
            //向接收者发数据的
            out = (DataOutputStream) socket.getOutputStream();
        } 
        catch (UnknownHostException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
     //向接收方发送文件名
        String fileName = fileToSend.getName();
        try {
out.writeUTF(fileName);
System.out.println("文件名:"+fileName);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        //向接收方发送文件大小
long fileSize = fileToSend.getTotalSpace();
try {
out.writeLong(fileSize);
System.out.println("文件大小:"+fileSize);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//
int read = 0;
byte[] fileBuf = new byte[1024*1000]; 
try {
dis = new DataInputStream(new BufferedInputStream(new FileInputStream(fileToSend)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("准备开始传输文件!");
while(true){
try {
read += dis.read(fileBuf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(read == -1){
break;
}
try {
out.write(fileBuf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("文件传输完成!");

//关闭流和Socket
try {
socket.close();
dis.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        
    }
    public static void main(String[] args){
     File file = new File("D://1.txt");
     User user = new User("127.0.0.1",6655,"1231233");
     FileSender fs = new FileSender(file,user);
     fs.start();
    
    }}
先运行FileReceiver.java
用户端开始监听:ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=6655]
然后运行FileSender.java
连接接受Socket[addr=/127.0.0.1,port=51209,localport=6655]
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
文件名:null
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:320)
at java.io.DataInputStream.readUTF(DataInputStream.java:572)
at java.io.DataInputStream.readUTF(DataInputStream.java:547)
at wei.guo.fileTransportation.ServerAndClient.FileReceiverThread.run(FileReceiverThread.java:54)
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:113)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at java.io.DataInputStream.readLong(DataInputStream.java:399)
at wei.guo.fileTransportation.ServerAndClient.FileReceiverThread.run(FileReceiverThread.java:63)
文件大小:0
准备开始接收文件!java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:113)
at java.io.DataInputStream.read(DataInputStream.java:83)
at wei.guo.fileTransportation.ServerAndClient.FileReceiverThread.run(FileReceiverThread.java:82)
文件成功传输完成!文件传输共计用时:0秒
请大侠们帮忙指导指导

解决方案 »

  1.   

    这是User对象,为了测试我建的package wei.guo.fileTransportaion.bean;public class User {

    //用户IP
    private String IP;

    //用户端口号
    private int port;

    //用户Id
    private String UserId;

    //构造方法
    public User(String ip, int port, String userId) {
    this.IP = ip;
    this.port = port;
    this.UserId = userId;
    }

    //IP的get和set方法
    public void setIP(String IP){
    this.IP = IP;
    }

    public String getIP(){
    return IP;
    }

    //port的get和set方法
    public void setPort(int port){
    this.port = port;
    }

    public int getPort(){
    return port;
    }

    //UserId的get和set方法
    public void setUserId(String UserId){
    this.UserId = UserId;
    }

    public String getUserId(){
    return UserId;
    }
    }
      

  2.   

    给你找到bug了   FileSender.java 的run改成  out = new DataOutputStream(socket.getOutputStream()); 不该的话出现了类型转换异常
      

  3.   

    原来如此,测试成功了,但为何不能强转为DataOutputStream类型呢,是不是涉及到IO底层方法的实现了?
    大侠还是要谢谢你了!
      

  4.   

    源代码是直接粘贴上来了  应该不会出现你说的问题。这是成功运行后的结果,并且在文件夹下找到了传输的文件:...........................
    用户端开始监听:ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=6655]
    连接接受Socket[addr=/127.0.0.1,port=52622,localport=6655]
    文件名:1.txt
    文件大小:78650093568
    准备开始接收文件!文件成功传输完成!文件传输共计用时:0秒
      

  5.   

    Ok。812866605qq.com   也可以加我QQ哈