Wysyłanie danych przez socket

0

Witam ostatnio na zajęciach miałem do napisania prosta aplikacje na sockecie (serwer miał odebrać wiadomość od klienta a następnie miał wysłać samemu wiadomość) wszystko niby banalne lecz nauczyciel kazał użyć nam BufferedReader i PrintWriter. Niby aplikacja napisałem ale problem polega na tym że wiadomość zostaje wysłana lecz druga strona jej nie odbiera (spostrzegłem że niekończące się wysyłanie wiadomości rozwiązuje problem ale tu nie o to chodzi) jakby ktoś mógł spojrzeć na kod i podać mi czemu tak się dzieje.
serwer :

public class Server {
      BufferedReader in; // strumień czytający
      PrintWriter out; // strumień wysyłający

    void runServer() throws IOException{

        ServerSocket server = new ServerSocket(3000);
        System.out.println("Server run ... ");
        Socket socket =  server.accept();
        System.out.println("Jest klient");
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(socket.getOutputStream(), true);
        System.out.println("czeka na wiadomosc");
        String readLine = in.readLine();
        System.out.println(readLine);
        out.println("Odpowiedz klienta");
        System.out.println("wysłano");

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

            new Server().runServer();

    }
}

klient :

public class Client {

    Socket connection;
    BufferedReader in;
    PrintWriter out;

    public Client() throws IOException, InterruptedException {
        String hostName = "localhost";
        connection = new Socket(hostName, 3000);
        System.out.println("Polaczono.....");
        in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        out = new PrintWriter(connection.getOutputStream());
        System.out.println("wysylam wiadomosc");
        out.println("wiadomosc od klienta");
        System.out.println("wysłano");
        System.out.println("czeka na odpowiedz");
        String readLine = in.readLine();
        System.out.println(readLine);

}

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

        Client client = new Client();
    }
}
0

Wydaje mi się, że po stronie klienta powinieneś po wysłanych danych dać out.flush(); czyli sflushowanie strumienia.

0

flush to jedno, ale pamietam, ze bylo cos ze znakiem nowej linii ... nie pamietam tylko co dokladnie. poszukaj

0

Server:


public class SocketServer {
    public static void main(String argv[]) throws Exception {
        String clientSentence;
        String capitalizedSentence;
        ServerSocket welcomeSocket = new ServerSocket(6789);

        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println("Received: " + clientSentence);
            capitalizedSentence = clientSentence.toUpperCase() + '\n';
            outToClient.writeBytes(capitalizedSentence);
        }
    }
}

klient:

 public class SocketClient {

    public static void main(String argv[]) throws Exception {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER: " + modifiedSentence);
        clientSocket.close();
    }

}

stad juz chyba wylapiesz..

 pzdr,
   misty
0

Wielkie dzięki dodanie out.flush(); u klienta załatwiło całą sprawę i wszystko już działa jak powinno.

0

A i mam jeszcze jedno pytanie dało by rade przez te strumienie wysłać tablice int dwuwymiarową? Czy raczej odpada taka możliwość.

0

Tak, dałoby radę.

0

A mogę w takim razie prosić o jakieś szczegóły lub najlepiej przykładowy kod.

0

Musisz wysłać najpierw wymiary tablicy, odebrać je i zaalokować taką tablicę u klienta. Potem w 2 pętlach zagnieżdżonych, jeżeli jest to 2 wymiarowa tablica, odbierasz wartości poszczególnych elementów. Klient już będzie wiedział kiedy przejść do nowego wiersza tablicy, bo będzie znał wymiary tablicy.

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