想使用Socket传输文件,得到的文件总是比原来的要小一点,但可以打开。
但传.rar文件后,收到的文件打不开。请教!!
代码如下:
服务器端:
public class TranFileServer {
    public static void main(String[] args){
        ServerSocket server;
        Socket st;
        try {
            server = new ServerSocket(4000);
            st = server.accept();
            File receivedfile = new File("src/2.rar");
            BufferedInputStream bin = new BufferedInputStream(st.getInputStream());
            FileOutputStream fout = new FileOutputStream(receivedfile);
            int i = bin.read();
            while(i != -1){
                fout.write(i);
                i = bin.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
客户端:
public class TranFileClient {
    public static void main(String[] args){
        try {
            Socket st = new Socket("localhost",4000);
            File f = new File("2.rar");
            FileInputStream fin = new FileInputStream(f);
            BufferedOutputStream bout = new BufferedOutputStream(st.getOutputStream());
            int size = fin.available();
            for(int i = 0;i < size; i++){
                bout.write(fin.read());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解决方案 »

  1.   

    不知道,我用socket传图片都打不开。
      

  2.   

    把流改成DataOutputStream和DataInputStream写一下
      

  3.   

    用DataOutputStream和DataInputStream写出来应该没什么问题
      

  4.   

    自己的客户端写的有问题,自己不flush 和 close,往往会有一部分存在缓存中而没发出去。自己在发送文件端手动flush和close。代码习惯啊!rar文件必须是完整的,不然会破外压缩格式。
      

  5.   


    int   size   =   fin.available(); 
    for(int   i   =   0;i   <   size;   i++){ 
                       bout.write(fin.read()); 
    } 修改成int   size   =   (int)f.length();
    for(int   i   =   0;i   <   size;   i++){ 
                       bout.write(fin.read()); 

    bout.flush();
      

  6.   

    RIGHT
    要不你就改用DataInputStream 和DataOutPutStream 这2个自动刷新缓存的
      

  7.   

    = =Socket不是不能保证顺序么
    应该用URL那个类传文件吧...