почему мой клиент не читает правильно outputStream, отправленный сервером? - PullRequest
0 голосов
/ 30 сентября 2010

Это простой клиент-сервер, где Сервер , использующий объект BufferedWriter, будет отправлять Клиенту получение в объекте BufferedReader.

Когда яиспользуйте OutputStream и PrintWriter для Сервер и InputStream и Scanner для Клиент это работает хорошо.

Что происходит, когда клиент в Buffered считывает -1, если я отправляю int и null для String.

Надеюсь, мой английский имеет смысл.; P

Это код:

Сервер :

import java.io.*;
import java.net.*;

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket server = new ServerSocket(8189);
        Socket incoming;

        incoming = server.accept();
        try {
            // OutputStream output = incoming.getOutputStream();
            // PrintWriter outStream = new PrintWriter(output, true /*autoFlush*/);
            // outStream.println("ENTER");
            BufferedWriter output = new BufferedWriter(new           
                                    OutputStreamWriter(incoming.getOutputStream()));
            output.write(3);
            System.out.println("\nSent");

        } finally {
            incoming.close();
        }
    }
}

Клиент :

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {

        //Client theClient= new Client();
        Socket RTSPSocket;
        int ServerPort = 8189;
        //server name address
        String ServerHost = "localhost";

        //get Server IP Address
        InetAddress ServerIPAddress = InetAddress.getByName(ServerHost);

        RTSPSocket = new Socket(ServerIPAddress, ServerPort);

        try {
            /*
            InputStream input = theClient.RTSPSocket.getInputStream();
            Scanner in = new Scanner(input);
            String line = in.nextLine();
            System.out.println(line);
            */

            BufferedReader input = new BufferedReader(new  
                                   InputStreamReader(RTSPSocket.getInputStream()));

            //String line = input.readLine();
            //System.out.println("\nRicevuto: " + line);
            System.out.println(input.read());
        } catch (Exception e) {
            System.err.println("Error: " + e);
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

попробуйте поставить следующий код после output.write (3);

output.flush();

BufferedOutputStream создан для отправки данных только тогда, когда буфер заполнен (я считаю, что по умолчанию 1024 байта). Таким образом, для принудительной отправки данных вам необходимо очистить поток.

1 голос
/ 30 сентября 2010

Вы должны сбросить данные, чтобы получить их в клиентской части.

        output.write(3);
        output.flush();
        System.out.println("\nSent");

Когда у вас есть OutputStream (или Writer), вы должны сбросить данные, так что вы уверены на 100%что то, что вы хотели отправить, было отправлено.

Большинство (если не все) подклассов OutputStream используют «мини-буфер», который сбрасывается только тогда, когда он заполнен или вы вручную вызываете flush().В вашем случае это еще более вопиюще, потому что вы используете BufferedWriter.

Другое дело, когда вы используете потоки / средства записи, вы действительно должны закрыть их после завершения, одна из главных вещейclose() do (большую часть времени) сбрасывает последние данные, оставшиеся в «мини-буфере».


Ресурсы:

...