Java: закрытие сокета клиента сбрасывает сокет сервера

1

У меня очень простая Java-программа капитализации. Клиент отправляет текст, считанный со стандартного ввода на сервер, который преобразует этот текст в заглавные буквы. Программа работает хорошо, но как только клиент остановлен (используется NetBeans ide), сервер также сбрасывается. Серверный сокет должен продолжать слушать новое соединение с клиентами независимо от остановленного клиента.

public class Client
{
public static void main(String[] args) throws IOException
{
    try(Socket s=new Socket("localhost",9090))
    {
        while(true)
        {
            PrintWriter out=new PrintWriter(s.getOutputStream(),true);
            BufferedReader rd=new BufferedReader(new InputStreamReader(s.getInputStream()));
            BufferedReader from=new BufferedReader(new InputStreamReader(System.in));

            String read=from.readLine();

            out.println(read);

            String answer;
            answer=rd.readLine();

            System.out.println(answer);
        }
    }
}
}

public class Server
{
public static void main(String[] args) throws IOException
{
    try(ServerSocket listener = new ServerSocket(9090);
            Socket socket = listener.accept();)
            {

                while (true)
                {
                    BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                    System.out.println("Started...");

                    String transform=br.readLine();

                    String newStr=transform.toUpperCase();

                    out.println(newStr);
                }
            }
}
}
  • 1
    Ну, ваша программа принимает только одно соединение. Если вы хотите принять больше, вы должны иметь петлю. См. Учебник по Java Socket Server, последняя часть
  • 0
    «Используйте цикл» - мой ответ.
Теги:
server
client

2 ответа

0

Случается нормальное поведение. Код сервера включает только обработку одного клиента. Функция listener.accept() принимает только последнее соединение с сервером. Вам нужно поместить прослушанный.accept() в цикл и обработать все исключения, которые возникают внутри. Код на стороне сервера должен выглядеть следующим образом:

public class Server
{
    public static void main(String[] args) throws IOException
    {
        try(ServerSocket listener = new ServerSocket(9090);
        while (true) {
            try {
                        Socket socket = listener.accept();)
                        …
            } catch (SocketException ex) {
                ...
            }
        }
    }
}

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

-1

Ваш Server закрывает соединение, а затем завершает работу, потому что он создается вне цикла while. Я считаю, что это то, что вам нужно.

public class Server {
    public static void main (final String[] args)
            throws IOException {

        while (true) {

            try (ServerSocket listener = new ServerSocket(9090); Socket socket = listener.accept();) {

                while (true) {
                    final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    final PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                    System.out.println("Started...");

                    final String transform = br.readLine();
                    if (transform == null) 
                        break;

                    final String newStr = transform.toUpperCase();

                    out.println(newStr);
                }
            }
        }
    }
}
  • 0
    Нет, потому что эта программа будет читать только одну строку от каждого клиента.
  • 0
    Извините, мое отсутствие внимания. Обновил ответ.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню