#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.