сокет не пишет на сервер

Есть вопрос с той же проблемой, но они мне не помогают.

Ниже приведен код, над которым я работал, где ServerSocket не получает никаких сообщений от клиента Socket.

Сервер

package rescue_server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.TreeMap;

/**
 *
 * @author Mohammad Faisal
 */
public class RServer {

    private TreeMap<String, PrintWriter> clients;
    private static final int PORT = 6621;

    private class ClientHandler implements Runnable {

        private PrintWriter writer;
        private BufferedReader reader;

        public ClientHandler(Socket client) {
            try {
                writer = new PrintWriter(client.getOutputStream());
                reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }

        @Override
        public void run() {
            System.out.println("client handler thread started");
            String msg;
            try {
                while ((msg = reader.readLine()) != null) {
                    System.out.println(msg);
                }
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }

    public RServer() {
        clients = new TreeMap<>();
    }

    public void start() {
        try {
            ServerSocket server = new ServerSocket(RServer.PORT);
            while (true) {
                System.out.println("waiting....");
                Socket client = server.accept();
                Thread tclient = new Thread(new ClientHandler(client));
                tclient.setDaemon(true);
                tclient.start();
                System.out.println("got a connection.");
            }
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static void main(String[] args) {
        new RServer().start();
    }
}

Клиент

package rescue_client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;

/**
 *
 * @author Mohammad Faisal
 */
public class RClient {

    private final static int SERVER_PORT = 6621;
    private final static String SERVER_IP = "127.0.0.1";
    private Socket socket;
    private PrintWriter writer;
    private BufferedReader reader;

    private class ServerHandler implements Runnable {

        @Override
        public void run() {
            System.out.println("server handler started.");
            String msg;
            try {
                while ((msg = reader.readLine()) != null) {
                    System.out.println(msg);
                }
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }

    public RClient() {
        JFrame frame = new JFrame(SERVER_IP);
        frame.setVisible(true);
        frame.setBounds(10, 20, 100, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void startServerHandler() {
        Thread tserver = new Thread(new ServerHandler());
        tserver.setDaemon(true);
        tserver.start();
        sendWelcomeMsg();
    }

    private void sendWelcomeMsg() {
        try {
            writer.write(InetAddress.getLocalHost().getHostName());
            writer.flush();
        } catch (UnknownHostException ex) {
            System.out.println(ex.getMessage());
        }
        writer.flush();
    }

    public void start() {
        System.out.println("starting client...");
        try {
            socket = new Socket(RClient.SERVER_IP, RClient.SERVER_PORT);
            writer = new PrintWriter(socket.getOutputStream());
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            startServerHandler();
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static void main(String[] args) {
        new RClient().start();
    }
}

Проблема в том, что я не получаю сообщение на server от client.


person Mohammad Faisal    schedule 21.09.2014    source источник
comment
Может быть, вы не отправляете настоящую строку? Сервер ждет строку — нечто большее, чем просто несколько байтов.   -  person Martin James    schedule 21.09.2014
comment
@MartinJames: в клиенте sendWelcomeMsg() я пишу это на сервер   -  person Mohammad Faisal    schedule 21.09.2014
comment
Добавьте новую строку ("\n") к отправляемой строке.   -  person Fildor    schedule 21.09.2014
comment
@Fildor: спасибо! оно работает. Почему его не отправляют без new line?   -  person Mohammad Faisal    schedule 21.09.2014
comment
readLine ждет, пока \n узнает, что строка заполнена, и возвращает результат. Итак, нет новой строки - нет полной строки - ждет readline... Не очень техническое объяснение, но в основном так и происходит.   -  person Fildor    schedule 21.09.2014
comment
возможный дубликат Socket comunication, Java-клиент C-сервер   -  person alk    schedule 21.09.2014
comment
@MohammadFaisal «Почему его не отправляют без новой строки», лол, потому что вы не сказали ему отправить ее (на что я намекал)!   -  person Martin James    schedule 22.09.2014
comment
@Martin Я также написал программу, в которой ввод из текстового поля качания отправляется на сервер. И в этом случае мне не нужно добавлять символ новой строки.   -  person Mohammad Faisal    schedule 22.09.2014


Ответы (1)


Из JavaDoc:

Строка считается завершенной переводом строки ('\n'), возвратом каретки ('\r') или возвратом каретки, за которым сразу следует перевод строки.

Поэтому вам нужно добавить один из них в отправляемую строку.

person Fildor    schedule 21.09.2014