Сервер и клиентская программа на Java: клиент должен начать и закончить разговор - PullRequest
0 голосов
/ 09 октября 2018

Клиенту необходимо начать и завершить разговор с ключевым словом «конец».Когда клиент вводит end и нажимает Enter, сервер должен напечатать «сеанс завершен», и клиент и сервер должны быть закрыты.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я заканчиваю работу на стороне клиента, сокет клиента закрывается, сервер печатает «сеанс завершен», но сокет сервера не закрывается, пока вы не нажмете Enter на стороне сервера.<- это ошибка.Мне нужно, чтобы оба заканчивались, когда вы печатаете end и нажимаете enter на стороне клиента.</p>

Сервер -

import java.io.*;
 import java.net.*;
 public class Server {
 public static void main(String[] args) {
    try {
        ServerSocket sSock = new ServerSocket(1201);
        Socket sock = sSock.accept();

        DataInputStream din = new DataInputStream(sock.getInputStream());
    DataOutputStream dout = new DataOutputStream(sock.getOutputStream());

        BufferedReader reader = new BufferedReader(new 
        InputStreamReader(System.in));

        String msgin = "";
        String msgout ="";

        while(!msgin.equals("end")) {
            msgin = din.readUTF();
            System.out.println(msgin);
            msgout = reader.readLine();
            dout.writeUTF("Server: " + msgout);
            dout.flush();
        }
        System.out.println("ended");
    } catch (Exception e) {
        // TODO: handle exception
    }
}
}

Клиент -

import java.io.*;
import java.net.*;

public class Client {
 public static void main(String[] args) {
    try {
        Socket sock = new Socket("127.0.0.1", 1201);
        System.out.println("Server: This is Server");
        DataInputStream din = new DataInputStream(sock.getInputStream());
    DataOutputStream dout = new DataOutputStream(sock.getOutputStream());

BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));

        String msgin ="";
        String msgout ="";
        while(!msgin.equals("end")) {
            msgout = reader.readLine();
            if (msgout.equals("end")) {
                sock.close();
            }
            dout.writeUTF("Client: " + msgout);
            msgin = din.readUTF();
            System.out.println(msgin);
        }
        sock.close();
        } catch (Exception e) {
        // TODO: handle exception
       }
      }
     }

Ответы [ 2 ]

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

Я проверил ваш код, и когда одна из сторон закроет сокет, он автоматически закроет соединение на другой стороне из-за особенностей работы сокетов.Если вы добавите sysout или e.printStackTrace (), вы увидите, что сокет закрывается с исключением, а программа заканчивается на другой стороне.

Однако вы можете рассмотреть возможность реализации несколькихпотоковое приложение, так что вы можете разрешить отправлять и получать сообщения как клиенту, так и серверу в любое время.По своей схеме, когда одна сторона отправляет сообщение, она может отправлять другую только после получения сообщения от другой стороны.

Простой, но полезный пример чата клиент / сервер можно посмотреть здесь.: Серверная / мультиклиентная программа не отправит сообщение всем клиентам

package so52712250;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket sSock = new ServerSocket(1201);
            Socket sock = sSock.accept();

            DataInputStream din = new DataInputStream(sock.getInputStream());
            DataOutputStream dout = new DataOutputStream(sock.getOutputStream());

            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            String msgin = "";
            String msgout = "";

            while (!msgin.equals("end")) {
                msgin = din.readUTF();
                System.out.println(msgin);
                msgout = reader.readLine();
                dout.writeUTF("Server: " + msgout);
                dout.flush();
            }
            System.out.println("ended");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 09 октября 2018

Проблема заключается в том, что сканер блокирует, пока не получит входные данные.

Одним из возможных решений было бы использование 2 потока.Один для чтения со сканера и один для чтения из потока.Если все заканчивается, убедитесь, что обе нити очищены.

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