0

私は、クライアントから送信されたデータを保存するファイルをサーバーに保持させたい、このクライアントサーバープログラミングにこだわっています。コードは次のとおりです。

クライアント側:

public class ClientSide {
    public static void main(String[] argv) throws Exception {

        String sentence;
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');            
        clientSocket.close();
}
}

サーバ側:

public class ServerSide {
     public static void main(String[] args) throws IOException {
            File file=new File("s1.txt");
            ServerSocket servsock = new ServerSocket(6789);

            Socket sock = servsock.accept();
            byte[] mybytearray = new byte[1024];
            InputStream is = sock.getInputStream();
            FileOutputStream fos = new FileOutputStream(file,true);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            int bytesRead = is.read(mybytearray, 0, mybytearray.length);
            bos.write(mybytearray, 0, bytesRead);

            bos.close();
            sock.close();

            BufferedReader write=new BufferedReader(new FileReader(file));
            String line;
            while((line=write.readLine())!=null) {
                System.out.println(line);
            }

     }
}

ここで、ユーザーがサーバーにデータを送信すると、たとえば「Vinayak」はサーバーに送信されるデータであり、最初の文字、つまり「V」のみがファイルに書き込まれます。コードで何かを見逃しているに違いなく、それを見つけることができません。また、ここで同様の質問をしましたが、望ましい結果が得られませんでした

4

1 に答える 1

1

読み取り操作が実際にサーバー側で必要な数のバイトを読み取ったことを確認する必要があります。InputStreamの javadoc を参照してください。

実際に読み取られたバイト数は整数として返されます。このメソッドは、入力データが使用可能になるか、ファイルの終わりが検出されるか、例外がスローされるまでブロックされます。

...

クラス InputStream の read(b, off, len) メソッドは、メソッド read() を繰り返し呼び出すだけです。このような最初の呼び出しで IOException が発生した場合、その例外は呼び出しから read(b, off, len) メソッドに返されます。その後の read() の呼び出しで IOException が発生した場合、その例外はキャッチされ、ファイルの終わりであるかのように処理されます。その時点までに読み取られたバイトが b に格納され、例外が発生する前に読み取られたバイト数が返されます

サーバーの読み取りコードをループに入るように変更します。

    int bytesRead = -1;
    while ((bytesRead = is.read(mybytearray, 0, mybytearray.length)) != -1) {
        System.out.println(bytesRead);
        bos.write(mybytearray, 0, bytesRead);
    }

サーバー側の出力:

1
85
9
9
    ...
5
10
8
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fermentum facilisis nulla id aliquet. Suspendisse venenatis condimentum erat adipiscing interdum. Etiam aliquet iaculis mauris lacinia lacinia. Morbi nec nisi est. Duis vel nunc a risus scelerisque feugiat. Morbi eget odio ac arcu vehicula facilisis vel ut nibh. Morbi sodales tristique ante eu aliquam. Ut a leo nisi. Morbi eu purus sed lectus mattis tincidunt.
于 2013-05-09T08:57:25.813 に答える