Как закрыть сокет определенным сообщением? - PullRequest
0 голосов
/ 23 октября 2018

Я стабилизировал сокетное соединение между Клиентом и Сервером, но теперь я пытаюсь заставить Сервер закрывать соединение всякий раз, когда он получает конкретное сообщение («FIM»), пока у меня нетудачи.Я продолжаю посылать сообщение "FIM", и соединение не закрывается

Вот код:

class Cliente {
    public static void main(String argv[]) throws UnknownHostException, IOException {
        InetAddress ip = InetAddress.getLocalHost();
        String hostName = ip.getHostName();
        Socket meuSocket = new Socket(hostName, 6789);

        PrintWriter saida = new PrintWriter(meuSocket.getOutputStream(), true);
        BufferedReader digitado = new BufferedReader(new InputStreamReader(System.in));

        while (meuSocket.isConnected()) {
            String mensagemParaServidor = digitado.readLine();
            if (mensagemParaServidor == "FIM") {
                meuSocket.close();
                break;
            }
            saida.println(mensagemParaServidor);
        }
    }
}

class Servidor {
    public static final int PORT = 6789;

    public static void main(String argv[]) throws IOException {
        new Servidor().rodarServidor();
    }

    public void rodarServidor() throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("Servidor pronto");

        while (true) {
            Socket meuSocket = serverSocket.accept();
            new ServerThread(meuSocket).start();
        }
    }

}

public class ServerThread extends Thread {
    Socket meuSocket;

    ServerThread(Socket meuSocket) {
        this.meuSocket = meuSocket;
    }

    public void run() {

        try {
            String mensagemRecebida = null;
            BufferedReader entrada = new BufferedReader(new InputStreamReader(meuSocket.getInputStream()));

            while (((mensagemRecebida = entrada.readLine()) != null)
                || ((mensagemRecebida = entrada.readLine()) != "FIM")) {
                System.out.println("Cliente enviou: " + mensagemRecebida);
                DataOutputStream saida = new DataOutputStream(meuSocket.getOutputStream());
                saida.writeBytes("Obrigado!");
            }
            System.out.println("Fechando servidor");
            meuSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Спасибо!

1 Ответ

0 голосов
/ 23 октября 2018

Никогда не сравнивайте активность с ==, используйте вместо этого равные.

Это плохая идея, просто использовать readLine.Лучше упакуйте свою строку в какое-нибудь сообщение и отправьте сообщение целиком.Таким образом, другая сторона может выяснить конец и начало сообщения.Например, первый байт может быть следующей длиной сообщения.Также вы дважды вызываете readLine в ServerThread

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...