0

こんにちは、ソケットからデータを読み取る単純な Java プログラムを作成していますが、入力のたびに多くのスペースが存在するという問題に遭遇しました。

目的: クライアント ソケットから正しいデータを読み取ることができる単純なサーバー ソケットを作成します。

これまでのところ、ソケットから読み取るコードを記述でき、データを読み取ることもできましたが、最後にたくさんのスペースができました。

そのため、最終的にスペースを管理するためにトリム()を使用する必要がありましたが、これが正しいか間違っているかはまだわかりません。

これに関する意見をいただければ幸いです。

注: Windows7 telnet サービスを使用してソケットに接続しています。

readSocket() {
    System.out.println(client_socket);
    try {
        System.out.println("reading socket");
        /*BufferedReader brIn = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
        String inputLine = null;
        while ((inputLine = brIn.readLine()) != null) {
            System.out.println(inputLine);
        }*/
        InputStream is = client_socket.getInputStream();
        byte[] byteArr = new byte[1024];
        int inputsize = -1;
        int currentPos = 0;
        StringBuffer sb = new StringBuffer(11111);
        /*while((inputsize = is.read(byteArr)) != -1) {
            String processed = new String(byteArr);
            sb.append(processed);
        }*/
        int BUFFER_SIZE = 1024;
        int read;
        byte[] buffer = new byte[BUFFER_SIZE];
        String processed = "";
        while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
            String current = new String(byteArr);
            //os.write(buffer, 0, read);
            System.out.println("current Process   "+current);

            //processed +=current;
            sb.append(current.toString().trim());
        }
        System.out.println("Socket input is : "+sb.toString());
        System.out.println("Sending response to client  "+processed.toString());
        //client_socket.getOutputStream().write(sb.toString().getBytes());
        //client_socket.getOutputStream().close();

        FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\himanshu2100\\eee.txt"));
        fos.write(processed.getBytes());
        fos.close();
        is.close();
        client_socket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Roger Lindsjö と mprivat の両方の提案をうまく利用して、ストリームから読み取る部分を再設計しました。

readSocket() {
    System.out.println(client_socket);
    try {
        System.out.println("reading socket");
        InputStream is = client_socket.getInputStream();
        byte[] byteArr = new byte[1024];

        int read;
        int BUFFER_SIZE = 1024;

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
            baos.write(byteArr, 0, read);   //This is an optimized design, instead of having so many strings
        }
        System.out.println("Output is :"+new String(baos.toByteArray()));
        baos.close();
        is.close();
        client_socket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

これがより良い解決策であることを願っているので、投稿してください。提案を歓迎します。

4

2 に答える 2

5

この行で:while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {

read実際に読み取られたバイト数が含まれるため、サーバーが文字列「CORRECT」を送信しているのにBUFFER_SIZE1024である場合、余分なスペースがたくさんあるため、これを行うことはできません: String current = new String(byteArr);. 代わりに、ストリームから読み取ったバイトのみを使用する必要があります。

String current = new String(byteArr, 0, read);
于 2013-03-14T11:58:56.240 に答える
1

配列に読み込むと、配列全体が満たされない場合があります。read変数には、実際に読み取られたバイト数が含まれます。

    while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
        String current = new String(byteArr, 0, read);
        System.out.println("current Process   "+current);
        sb.append(current);
    }

マルチバイトのエンコーディングを使用すると、文字の各部分が別々に読み取られ、無効なシーケンスが作成されるため、上記が機能しない可能性があります。

于 2013-03-14T11:59:25.903 に答える