ObjectOutputStream — связь клиент/сервер

Я новичок в связи с клиентским сервером Java, и я столкнулся с отправкой объекта с клиентской стороны на серверную. Почему-то моя программа зависает при попытке передать объект. Вероятной причиной может быть реализация ObjectOutputStream.

Кнопка входа в базу данных

class Handler implements ActionListener {
   Client client = new Client();
   List<String> parameterList = new ArrayList<String>();
   ClientParameter parameter;

   public void actionPerformed(ActionEvent event) {
      if(event.getSource()==buttonConnect) {
         parameterList.add(username);
         parameterList.add(password);
         parameter = new ClientParameter(parameterList);
         client.connectToServer(parameter);
}

Объект КлиентПараметр

public class ClientParameter {
   List<String> parameterList;

   public ClientParameter(List<String> parameterList) {
      this.parameterList = parameterList;
   }

   public List<String> getParameterList() {
      return parameterList;
   }
   public void setParameterList(List<String> parameterList) {
      this.parameterList = parameterList;
   }
}

Клиент класса

public void connectToServer(ClientParameter parameter) {
   // Verbindung mit dem Server herstellen
   Socket server = null;
   try {
      server = new Socket("localhost", 3141);
      // programm hangs while reading this 2 lines..
      ObjectInputStream objectIn = new ObjectInputStream(server.getInputStream());
      ObjectOutputStream objectOut = new ObjectOutputStream(server.getOutputStream());

      objectOut.writeObject(parameter);
   } catch(UnknownHostException e) {
      e.printStackTrace();
   } catch(IOException e) {
      e.printStackTrace();
   } finally {
      if(server!=null) {
         try {
            server.close();
         } catch(IOException e) {
            System.out.println(e);
         }
      }
   }
}

И класс сервера

public class Server {
   private static void handleConnection(Socket client) throws IOException {
      ObjectInputStream objectIn = new ObjectInputStream(client.getInputStream());
      ObjectOutputStream objectOut = new ObjectOutputStream(client.getOutputStream());

      ClientParameter parameter;
      try {
         parameter = (ClientParameter) objectIn.readObject();
         System.out.println(parameter);
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) throws IOException {
      ServerSocket server = new ServerSocket(3141);
      while(true) {
         Socket client = null;
         try {
            client = server.accept();
            handleConnection(client);
         }
         catch(IOException e) {
            e.printStackTrace();
         }
         finally {
            if(client!=null) {
               try {
                  client.close();
               }
               catch(IOException e) {
                  System.out.println(e);
               }
            }
         }
      }
   }
}

Благодарю вас!


person user3548416    schedule 13.08.2014    source источник
comment
ClientParameter должен быть сериализуемым   -  person Salem    schedule 13.08.2014
comment
Спасибо за эту информацию, но ошибка все еще возникает при чтении двух строк ObjectInputStream и ObjectOutputStream.   -  person user3548416    schedule 14.08.2014
comment
Попробуйте сбросить потоки.   -  person kag0    schedule 14.08.2014


Ответы (1)


Сервер начинает с чтения того, что отправляет клиент. И клиент тоже начинает с чтения того, что отправляет сервер. Так что это тупик.

Действительно, как документировано, конструктор ObjectInputStream блокируется до тех пор, пока не получит заголовок потока сериализации:

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

Удалите следующую строку, так как вы все равно ничего не делаете с ObjectInputStream:

ObjectInputStream objectIn = new ObjectInputStream(server.getInputStream());
person JB Nizet    schedule 13.08.2014