2016-03-28 1 views
0

Я пытался решить проблему довольно долго и, наконец, решил воспользоваться помощью экспертов. Я разработал сервер-клиентское приложение, используя Socket Programming, и мой клиент имеет возможность успешно подключиться к Серверу. Теперь я пытаюсь отправить объект через сокет с сервера на основе запроса от клиента, мой сервер может поймать запрос, однако ответ (writeObject (...)), отправленный сервером, не может связаться с клиентом ,

сервера фрагмент кода:Клиент не принимает объект, отправленный сервером поверх объекта ObjectStream в Java

ServerSocket sSocket = new ServerSocket(socketNumber); 
ArrayList<LoginPassword> logIn = new ArrayList<>(); 
Socket cSocket = sSocket.accept(); 
ObjectOutputStream outputStream = new ObjectOutputStream(cSocket.getOutputStream()); 
outputStream.flush(); 
ObjectInputStream inputStream = new ObjectInputStream(cSocket.getInputStream()); 
LoginPassword lp1 = new LoginPassword("admin","admin"); 
logIn.add(lp1); 
outputStream.writeObject(logIn); 
outputStream.flush(); 

Clinet код сниппета:

Socket client = new Socket(InetAddress.getLocalHost(),socketNumber); 
ArrayList<LoginPassword> myList = new ArrayList<>(); 
ObjectOutputStream outputStream = new ObjectOutputStream(client.getOutputStream()); 
outputStream.flush(); 
ObjectInputStream inputStream = new ObjectInputStream(client.getInputStream()); 
//Wait untill the data is available 
myList = (ArrayList<LoginPassword>) inputStream.readObject(); 

В моем случае, клиенты readObject() никогда не вызывается, так как он не в состоянии обнаружить данные, посланные от Server.Any помогите пожалуйста.

+0

Почему вы открываете InputStream на сервере, так как вы ничего не читаете. То же самое для клиента: почему вы открываете OutputStream, так как вы ничего не пишете? –

+0

Это всего лишь фрагмент кода для объяснения моей проблемы. Я использую inputStream и OutputStream на стороне клиента и сервера для отправки данных взад и вперед во время работы приложения. – Rambo772

+0

Удалите их первым, и ваш код должен работать нормально. Затем верните их, но в правильном порядке клиент, который первым читает, должен сначала открыть входной поток, прочитать, а затем записать. Сначала сервер, который пишет, должен сначала открыть выходной поток, записать, а затем открыть входной поток. –

ответ

0

Сначала вы должны создать ObjectOutputStream, желательно с обоих концов. Кроме того, вы получите тупик, создающий ObjectInputStream.

В качестве альтернативы я бы любопытно узнать, что означает следующий комментарий:

// Wait untill the data is available 

Если это указывает фрагмент отсутствует код, который вызывает available(), просто удалите его. readObject() будет блокироваться ровно столько, сколько необходимо. Существует несколько правильных применений available(), и это не один из них.

+0

OMG, что является удивительным. У меня был доступный(), который ждет сообщения, когда я удалил его и напрямую вызвал readObject(), он работал отлично. Теперь, после этой реализации, еще один вопрос, который у меня на уме, если я это сделаю, он будет заблокирован до тех пор, пока ответ не будет получен, но в моей программе иногда сервер не отправляет ответ, если данные не найдены, как я могу идти дальше readObject() после заданного времени ожидания? – Rambo772

+0

Установите тайм-аут чтения с помощью 'Socket.setSoTImeout()' и получите результат 'SocketTimeoutException'. – EJP

+0

Большое спасибо @EJP, я тестировал его, и он работает как шарм. Очень ценю вашу помощь. – Rambo772

Смежные вопросы