Почему мой клиент не читает правильно, что вывод выпускается на сервере?
-
26-09-2019 - |
Вопрос
Это простой клиент-сервер, где с помощью BufferedWriter
Объект отправит на BufferedReader
.
Когда я использую OutputStream
и PrintWriter
для и InputStream
и Scanner
для Клиент это работает хорошо.
Что происходит, это то, что клиент в Буферизованный путь читает -1, если я посылаю int. и нулевой за Нить.
Я надеюсь, что мой английский имеет смысл. ;П
Это код:
Сервер:
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);
}
}
}
Решение
Вы должны промывать данные, чтобы получить их в клиентской части.
output.write(3);
output.flush();
System.out.println("\nSent");
Большинство (если не все) подклассы вывода используют «мини-буфер», который промывается только тогда, когда он заполнен или вы вручную звоните flush()
. Отказ В вашем случае, это еще более вописно, потому что вы используете BufferedWriter
.
Еще одна вещь, когда вы используете потоки / писатели, вы действительно должны закрыть их после того, как вы закончите, одно из главных close()
Делать (большую часть времени) - промывка последних данных, оставшихся в «мини-буфере».
Ресурсы :
Другие советы
Попробуйте поместить следующий код после вывода .WRITE (3);
output.flush();
PUFFEREDOUTPUTSTREAM создан только для отправки данных только при заполнении буфера (я считаю, что по умолчанию 1024 байты). Таким образом, заставить данные для отправки вам нужно промыть поток.