Cześć, robię przykład z książki Marcina Lisa "Java ćwiczenia zaawansowane". Jestem w trakcie przerabiania 4 tematu i napotkałem błąd. Zagadnieniem tematu 4 jest komunikacja klient serwer. Po pierwsze w kodzie w książce jest napisane
//pętla główna klienta
while(true){
try{
line = brLocalInp.readLine();
if(line != null){
System.out.println("Wysyłam: " + line);
out.writeBytes(line + '\n');
out.flush();
}
if(line == null || "quit".equals(line)){
System.out.println("Kończenie pracy...");
clientSocket.close();
System.exit(0);
}
line = brSockInp.readLine();
System.out.println("Otrzymano: " + line);
}
Sory za wcięcia ale kopiowane z pdfa. Chodzi mi konkretnie o ten kawałek
line = brSockInp.readLine();
System.out.println("Otrzymano: " + line);
W kodzie który możemy pobrać z ftp z heliona jest tak
brSockInp.readLine();
System.out.println("Otrzymano: " + line);
Przez co wydaje się teoretycznie, że program działa bo wyświetla line odczytaną wcześniej. Po zmianie na wersję z książki output z klienta wygląda następująco
Połączono z Socket[addr=localhost/127.0.0.1,port=6666,localport=55877]
hej
Wysyłam: hej
Otrzymano: hej
elo
Wysyłam: elo
Otrzymano:
test
Wysyłam: test
Otrzymano: elo
test2
Wysyłam: test2
Otrzymano:
Nie bardzo mogę wpaść na to jak poprawić ten błąd.
Wszystkie klasy wyglądają tak
import java.net.*;
import java.io.*;
public class EchoServer
{
public static void main(String args[])
{
ServerSocket serverSocket = null;
Socket socket = null;
try{
serverSocket = new ServerSocket(6666);
}
catch(IOException e){
System.out.println(
"Błąd przy tworzeniu gniazda serwerowego " + e);
System.exit(-1);
}
System.out.println("Inicjalizacja gniazda zakończona...");
System.out.println("Parametry gniazda: " + serverSocket);
while(true){
try{
socket = serverSocket.accept();
}
catch(IOException e){
System.out.println("Błąd wejścia-wyjścia: " + e);
}
System.out.println("Nadeszło połączenie...");
System.out.println("Parametry połączenia: " + socket);
new Thread(new EchoServerThread(socket)).start();
}
}
}
import java.net.*;
import java.io.*;
public class EchoServerThread implements Runnable
{
protected Socket socket;
public EchoServerThread(Socket clientSocket)
{
this.socket = clientSocket;
}
public void run()
{
//Deklaracje zmiennych
BufferedReader brinp = null;
DataOutputStream out = null;
String threadName = Thread.currentThread().getName();
//inicjalizacja strumieni
try{
brinp = new BufferedReader(
new InputStreamReader(
socket.getInputStream()
)
);
out = new DataOutputStream(socket.getOutputStream());
}
catch(IOException e){
System.out.println(threadName + "| Błąd przy tworzeniu strumieni " + e);
return;
}
String line = null;
//pętla główna
while(true){
try{
line = brinp.readLine();
System.out.println(threadName + "| Odczytano linię: " + line);
//badanie warunku zakończenia pracy
if((line == null) || "quit".equals(line)){
System.out.println(threadName + "| Zakończenie pracy z klientem: " + socket);
socket.close();
return;
}
else{ //odesłanie danych do klienta
out.writeBytes(line + "\n\r");
System.out.println(threadName + "| Wysłano linię: " + line);
}
}
catch(IOException e){
System.out.println(threadName + "| Błąd wejścia-wyjścia." + e);
return;
}
}
}
}
import java.net.*;
import java.io.*;
public class Client
{
public static void main(String args[])
{
String host = "localhost";
int port = 6666;
//Inicjalizacja gniazda klienckiego
Socket clientSocket = null;
try{
clientSocket = new Socket(host, port);
}
catch(UnknownHostException e){
System.out.println("Nieznany host.");
System.exit(-1);
}
catch(ConnectException e){
System.out.println("Połączenie odrzucone.");
System.exit(-1);
}
catch(IOException e){
System.out.println("Błąd wejścia-wyjścia: " + e);
System.exit(-1);
}
System.out.println("Połączono z " + clientSocket);
//Deklaracje zmiennych strumieniowych
String line = null;
BufferedReader brSockInp = null;
BufferedReader brLocalInp = null;
DataOutputStream out = null;
//Utworzenie strumieni
try{
out = new DataOutputStream(clientSocket.getOutputStream());
brSockInp = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
brLocalInp = new BufferedReader(
new InputStreamReader(System.in));
}
catch(IOException e){
System.out.println("Błąd przy tworzeniu strumieni: " + e);
System.exit(-1);
}
//Pętla główna klienta
while(true){
try{
line = brLocalInp.readLine();
if(line != null){
System.out.println("Wysyłam: " + line);
out.writeBytes(line + '\n');
out.flush();
}
if(line == null || "quit".equals(line)){
System.out.println("Kończenie pracy...");
clientSocket.close();
System.exit(0);
}
line = brSockInp.readLine();
System.out.println("Otrzymano: " + line);
}
catch(IOException e){
System.out.println("Błąd wejścia-wyjścia: " + e);
System.exit(-1);
}
}
}
}
Edit:
Gdy łączę się poprzez telnet wszystko wygląda okej po stronie serwera, więc myślę że problem leży po stronie klienta.
Edit 2:
Tak sobie przypomniałem, że z bufferedReader kiedyś też już miałem problem. Ktoś mi to tłumaczył o co chodzi, ale niestety nie pamiętam. Dodałem dodatkowe odczytywanie linii w kliencie i niby działa. Teraz wygląda to tak
line = brSockInp.readLine();
brSockInp.readLine();
System.out.println("Otrzymano: " + line);