Сокеты Java: Как читать / записывать объекты и строки?

#sockets #object #stream

#сокеты #объект #поток

Вопрос:

Я пытаюсь написать клиентско-серверную программу, в которой клиент может: * Записывать строку на сервер * Получать объект с сервера

и сервер может: * Получать строку от клиента * Отправлять объект клиенту.

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

Что-то не так с моим выбором потоков, или есть лучший способ использования потоков, который я не подобрал?

Объект, который я отправляю, сериализуется, хотя объект никогда не записывается / не считывается, поскольку сервер зависает на readUTF()

Заранее благодарю вас за любую помощь.

 //Used to receive a string input from client side
DataInputStream input = new DataInputStream(clientSocket.getInputStream());
// Used to output an object to client side
ObjectOutputStream oo = new ObjectOutputStream(clientSocket.getOutputStream());

// This is never executed..
clientInput = input.readUTF();
oo.writeObject(book);
  

Код на стороне клиента:

         // Used to read object from server side
        input = new ObjectInputStream(clientSocket.getInputStream());
        // Used to read input from command line
        keyboard = new BufferedReader(new InputStreamReader(System.in));
        // Used to send string to server
        output = new DataOutputStream(clientSocket.getOutputStream());

        cmdInput = keyboard.readLine();
        // Write to server, this executes at runtime.
        output.writeUTF(cmdInput);                              
        // Object is never sent, this line is not executed.
        book = (Book)input.readObject();
  

Комментарии:

1. Поскольку вы используете ObjectInputStream и ObjectOutputStream, я предполагаю, что вы хотите использовать TCP. Можете ли вы включить код, в котором вы создаете clientSocket как для сервера, так и для клиента? Вы используете класс ServerSocket для сервера, верно?

2. Да, я использую ServerSocket для сервера и сокет для клиента. Подключение к клиент-серверу работает нормально, поскольку я смог просто передавать строки. Именно тогда, когда я добавил функциональность объекта, он начал ломаться.

3. Но ваш клиентский код застревает перед вызовом writeObject…

Ответ №1:

В общем, вам было бы лучше использовать набор веб-сервисов (например, Apache CXF), чем делать это самостоятельно.

В частности, попробуйте вызвать flush() свой выходной поток в клиенте.

Комментарии:

1. Я пробовал вызывать flush в клиенте, это не внесло никаких изменений. Кроме того, для решения этой задачи он подходит, который я разрабатываю только в библиотеке JDK.

2. В Java 1.6 есть полный набор веб-сервисов в JDK.