Программирование сокетов Java. Ошибка на стороне сервера

Я написал программу сокета Java, в которой две строки должны быть переданы серверу со стороны клиента. Сервер вернет объединенную строку и длину объединенной строки. Цель состоит в том, чтобы отправить на сервер строку «exit», чтобы закрыть соединение после получения желаемого результата. Я получаю желаемый результат (сервер отправляет объединенную строку и размер), но на стороне сервера появляется ошибка.

Я также получаю четыре копии введенных мной строк на стороне сервера вместо одной. Вот выходной снимок экрана Программирование сокетов Java. Ошибка на стороне сервера

Вот мой код на стороне сервера:

    import java.io.*;
    import java.net.*;
    public class Provider1{

           ServerSocket providerSocket;
           Socket connection = null;
           ObjectOutputStream out;
           ObjectInputStream in;
           String message;
           String x = "";
           int count=0;
           Provider1(){}
           void run()
           {
                try{
                //1. creating a server socket
                providerSocket = new ServerSocket(2004, 10);
                //2. Wait for connection
                System.out.println("Waiting for connection");
                connection = providerSocket.accept();
                System.out.println("Connection received from " + connection.getInetAddress().getHostName());
                //3. get Input and Output streams
                out = new ObjectOutputStream(connection.getOutputStream());
                out.flush();
                in = new ObjectInputStream(connection.getInputStream());
                sendMessage("Connection successful");
              //4. The two parts communicate via the input and output streams
               do{
                      try{
                          message = "";
                          message = (String)in.readObject();
                          System.out.println("client>" + message);
                          x+=message;
                          count++;
                          if (count==2)
                          {
                              sendMessage("The concatenated string : "+x);
                              sendMessage("The length of concatenated string : "+x.length());
                              message = "exit";
                           }
                           if (message.equals("exit"))
                               sendMessage(message);
                       }
                       catch(ClassNotFoundException classnot){
                             System.err.println("Data received in unknown format");
                       }
              }while(!message.equals("exit"));
         }
         catch(IOException ioException){
               ioException.printStackTrace();
          }
          finally{
             //4: Closing connection
              try{
                    in.close();
                    out.close();
                    providerSocket.close();
                 }
                 catch(IOException ioException){
                      ioException.printStackTrace();
                 }
           }
     }
         void sendMessage(String msg)
         {
             try{
                out.writeObject(msg);
                out.flush();
              }
              catch(IOException ioException){
                   ioException.printStackTrace();
              }
          }
          public static void main(String args[])
          {
                Provider1 server = new Provider1();
                while(true)
                {
                     server.run();
                }
           }
   }

Это мой код на стороне клиента

    import java.io.*;
    import java.net.*;
    public class Requester1{
Socket requestSocket;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Requester1(){}
void run()
{
    try{
        //1. creating a socket to connect to the server
        requestSocket = new Socket("localhost", 2004);
        System.out.println("Connected to localhost in port 2004");
        //2. get Input and Output streams
        out = new ObjectOutputStream(requestSocket.getOutputStream());
        out.flush();
        in = new ObjectInputStream(requestSocket.getInputStream());
        //3: Communicating with the server
        do{
            try{
                message = (String)in.readObject();
                System.out.println("server>" + message);
                sendMessage("Hello");
                sendMessage("There");
                message = "exit";
                sendMessage(message);
            }
            catch(ClassNotFoundException classNot){
                System.err.println("data received in unknown format");
            }
        }while(!message.equals("exit"));
    }
    catch(UnknownHostException unknownHost){
        System.err.println("You are trying to connect to an unknown host!");
    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
    finally{
        //4: Closing connection
        try{
            in.close();
            out.close();
            requestSocket.close();
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
}
void sendMessage(String msg)
{
    try{
        out.writeObject(msg);
        out.flush();
        //System.out.println("client>" + msg);
    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
}
public static void main(String args[])
{
    Requester1 client = new Requester1();
    client.run();
}
    }

Не размещайте здесь изображения текста. Пустая трата вашего времени и нашей пропускной способности. Разместите текст.

user207421 31.03.2018 02:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
188
1

Ответы 1

Ваш цикл чтения продолжается до тех пор, пока не будет прочитан "bye", и клиент не закроет сокет, не отправив его. Вот что происходит.

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

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

@Piotr Если это комментарий, он должен быть адресован OP. Если это ответ, его следует опубликовать как ответ. Если это комментарий к моему ответу, это лишний раз.

user207421 31.03.2018 02:04

@Piotr В моем ответе нет раздела «Он хочет отправить ответ, но его никто не слушает». Это твои слова. Это раздел в вашем комментарии. Итак, ваш комментарий является продолжением вашего комментария? Значит, непонятен ваш собственный комментарий? В этом нет никакого смысла. И это не имеет никакого отношения к реальной проблеме.

user207421 31.03.2018 02:12

Верно, скопировал и вставил неправильный фрагмент. Я хотел вставить этот «клиент также должен читать сообщения, которые ему отправляются». Я думаю, что для пользователя 3804152 может быть непонятно, каков точный поток сообщений между клиентом и сервером, и что это означает, что ему нужно прочитать отправляемое сообщение (учитывая, что его / ее код в целом имеет низкое качество , Я предполагаю, что для объяснения проблемы необходим обширный пример). Не стесняйтесь проголосовать против моего комментария, если считаете, что это необходимо :-)

Piotr 31.03.2018 02:14

@Piotr "Что значит читать" - это не вопрос, на который нужно отвечать. Он уже читает сообщения в своем существующем коде.

user207421 01.04.2018 03:52

Другие вопросы по теме