0

こんにちは、ソケットを介してファイルを送信する方法を学習しようとしているので、クライアントとサーバーの 2 つの非常に単純な Java クラスをコーディングしました。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static void main (String[] args)throws IOException{
        File f = new File("J:\\RepServer\\zebi.txt");
        if(!f.exists()){
            f.createNewFile();
            }
        //System.out.print(f.exists()+f.getName());
        ServerSocket ss = new ServerSocket(1000);
        Socket s = ss.accept();
        FileInputStream fileStream = new FileInputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
        oos.writeObject("Envoi Fichier|"+f.getName()+"|"+f.length());
        byte[] buffer = new byte[150000];
        long completed =0;
        while(completed <= f.length()){
            fileStream.read(buffer);
            oos.write(buffer);
            completed += 150000;
        }
        oos.writeObject("Envoi termine");
        fileStream.close();
    }
}

そしてクライアントクラス

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;


public class Client {

/**
 * @param args
 * @throws ClassNotFoundException 
 */
public static void main(String[] args) throws IOException, ClassNotFoundException {
    new File("J:\\RepClient\\").mkdir();
    Socket s = new Socket("127.0.0.1",1000);
    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
    String fileName = ((String)ois.readObject()).split("|")[1].trim();
    FileOutputStream fos = new FileOutputStream("J:\\RepClient\\"+fileName);
    byte[] buffer = new byte[200000];
    int byteLus = 0, compteur = 0;
    while(byteLus >= 0){
        byteLus = ois.read();
        if(byteLus >= 0){
            fos.write(buffer, 0, byteLus);
            compteur += byteLus;
            System.out.println("Le nombre de bytes lus est :"+byteLus);
        }
        if(byteLus < 1024){
            fos.flush();
            break;
        }
    }
}

}

サーバーを起動してからクライアントを起動すると、サーバーはファイルをクライアントに送信し、クライアントはファイルを作成しますが空です。これは、サーバーがファイルに書き込む前にこの例外が発生するためです。

Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeBlockHeader(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream.write(Unknown Source)
at Server.main(Server.java:25)

問題は、クライアントのソケットまたはストリームを閉じていないことです。では、なぜ接続が閉じられているのでしょうか? ところで、フラッシュは何をしているのですか?

4

2 に答える 2