[JAVA/CLIENT-SERVER] Serwer nie otrzymuje danych

0

Witam, mam irytujący problem. Napisałem prosty program CLIENT-SERVER i mimo, że wszystko wygląda poprawnie to serwer nie otrzymuje danych. Próbowałem już różnych sposobów.
Najlepiej będzie to widać w kodzie.

SERWER:

package Komunikator;

import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.io.IOException;
import java.net.Socket;
import java.io.BufferedOutputStream;
import java.io.ObjectOutputStream;
import java.io.BufferedInputStream;
import java.io.ObjectInputStream;
import java.io.EOFException;
import java.net.SocketException;

public class KomunikatorServer extends Thread {
    private static void println(String msg) {
        System.out.println(msg);
    }

    private String host = "localhost";
    private int port;
    
    public KomunikatorServer(int p) {
        this.port = p;
    }

    @Override
    public void run() {
        println("SERWER");
        
        try {
            InetSocketAddress address = new InetSocketAddress(host, port);
            ServerSocket serverSock = new ServerSocket();
            serverSock.bind(address);

            println("SERWER URUCHOMIONY");
            println("CZEKAM NA PODLACZENIE KLIENTA...");

            // Przyjmuje polaczenie od klienta.
            Socket sock = serverSock.accept();
            println("KLIENT PODLACZONY");

            BufferedInputStream in = new BufferedInputStream(sock.getInputStream());
            BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream());

            //ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));
            //ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(sock.getOutputStream()));

            println("TUTAJ");

            while(true) {
                int count = in.read();
                println(""+ count);
                /*
                try {
                    buffer = in.readUTF();
                } catch(EOFException e) {
                    println("Wczytany tekst: "+ buffer);
                }*/
                Thread.sleep(1000);
            }

            // Zamykam polaczenie z klientem.
            //sockClient.close();
            //serverSock.close();
        } catch(SocketException e) {
            println("KLIENT ZERWAL POLACZENIE Z SERWEREM");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

KLIENT:

package Komunikator;

import java.net.InetSocketAddress;
import java.net.Socket;
import java.io.BufferedOutputStream;
import java.io.ObjectOutputStream;
import java.io.BufferedInputStream;
import java.io.ObjectInputStream;
import java.net.ConnectException;
import java.io.EOFException;
import java.net.SocketException;

public class KomunikatorClient extends Thread {
    private static void println(String msg) {
        System.out.println(msg);
    }

    private String host;
    private int port;

    public KomunikatorClient(String h, int p) {
        this.host = h;
        this.port = p;
    }

    @Override
    public void run() {
        println("KLIENT");
        
        InetSocketAddress address = new InetSocketAddress(host, port);
        Socket sock = new Socket();

        try {
            sock.connect(address);
            println("PODLACZONY DO SERWERA");

            BufferedInputStream in = new BufferedInputStream(sock.getInputStream());
            BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream());

            //ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));
            //ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(sock.getOutputStream()));
            
            while(true) {
                String str = "HELLO!";
                out.write(str.getBytes());
                println(str);
                Thread.sleep(1000);
            }
            
        } catch(ConnectException e) {
            println("SERWER NIEDOSTEPNY");
        } catch(SocketException e) {
            println("KLIENT ZERWAL POALCZENIE Z SERWEREM");
        } catch(Exception e) {
            e.printStackTrace();
        }
        try {
            sock.close();
        } catch(Exception e) {
        }
    }
}

Połączenie jest nawiązywane wysyłam wiadomość ale serwer zatrzymuje się w momencie odbioru danych. Czeka, czeka i nic nie przychodzi. Mimo, że klient wielokrotnie wysyła te dane.

Pomoże ktoś?
Dzięki

0

Popatrz sobie na przykładowy program:

http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

Na uczelni robiłem kilka programów na podstawie powyższego przykładu i nie miałem problemów.

0

Hehe, boże jak zawsze banalny problem. Tylko spojrzałem na przykład i od razu zauważyłem, że brakuje metody flush().
Dzięki :)
Pozdrawiam

0

Kurde nadal jest coś źle. Zmieniłem teraz podejście z wysyłania strumienia bajtów na wysyłanie zserializowanego obiektu.

Program zatrzymuje się na linijce.

ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));
ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(sock.getOutputStream()));

Co tu może być nie tak?

EDIT:

Kurde jestem w kole. Gdy wykomentuję strumień odbierający w Kliencie i wysyłający w Serwerze to program działa.
Działa także gdy strumień odbierający w Kliencie pobiorę dopiero po wysłaniu obiektu do Serwera.

ObjectOutputStream out = new ObjectOutputStream(sock.getOutputStream());

String str = "HELLO!";
out.writeObject(str);

ObjectInputStream in = new ObjectInputStream(sock.getInputStream());

Czemu się tak dzieje?

EDIT2:

Kolejne analizy i kolejne spostrzeżenia. Mianowicie nie mogę jednocześnie opakować dwóch strumieni klasami umożliwiającymi odczytywanie i zapis do gniazda obiektów.

InputStream is = sock.getInputStream();
//ObjectInputStream in = new ObjectInputStream(is);
OutputStream os = sock.getOutputStream();
ObjectOutputStream out = new ObjectOutputStream(os);

String str = "HELLO!";
out.writeObject(str);

Tu linijkę musiałem wykomentować bo bez komentarza program nie działa. Czemu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1