2015-04-10 4 views
0

У меня есть сервер, который прослушивает IP/Port. Сокет, который они открывают, является постоянным и не закрывается, пока не получит сообщение CLOSE от клиента, то есть ZERO байты. У меня есть код клиента следующим образом:Разъем сервера не закрыт

java.net.URL url = new java.net.URL(Constants.URL); 
     urlConnection = (HttpsURLConnection) url.openConnection(); 
     if(WelcomeScreen.mySslContext==null) { 
      WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory(); //reads the CA certificate and return the getSocketFactory context 
     } 
     urlConnection.setSSLSocketFactory(WelcomeScreen.mySslContext); 
     urlConnection.setReadTimeout(1000*15000); 
     urlConnection.setConnectTimeout(1000*20000); 
     urlConnection.setDoOutput(true); 
     urlConnection.setDoInput(true); 
     urlConnection.setUseCaches (false); 
     urlConnection.connect(); 

     //Send Stream on server 
     OutputStream outStream = urlConnection.getOutputStream(); 
     outStream.write(bytes); 
     outStream.flush(); 
     outStream.close(); 

     //Receive Stream from server 
     in = urlConnection.getInputStream(); 
     in.close(); 
     urlConnection.disconnect(); 

После того, как приведенный выше код выполняется, сервер еще не получает ЗАКРЫТЬ сообщение, пока я на самом деле выйти из моего Android App.

Можете ли вы предложить, что мне нужно сделать, чтобы сервер получил сообщение CLOSE от клиента, чтобы они освободили соединение с каким-либо другим клиентом?

Еще одно замечание состоит в том, что при повторном выполнении вышеуказанного кода, то есть копирования-вставки и попытки отправить еще один запрос в последовательности, я могу повторно использовать сокет, открытый в первый раз. В то время как, если удалить условие:

if(WelcomeScreen.mySslContext==null) 

и заставить код для выполнения:

WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory(); 

затем создает новый сокет и делает SSL рукопожатия снова. Это нормальное поведение?

ответ

0

Разъем, который они открывают, является постоянным и не закрывается, пока не получит сообщение CLOSE от клиента, то есть ZERO байты.

Вы не можете получить нулевые байты в сокете. Вы либо получаете один или несколько байтов, либо конец потока, либо ошибку (исключение в Java). Что-то серьезно не так с вашим протоколом приложения здесь.

, когда я повторно выполнить приведенный выше код, т.е. копировать-вставить и попытайтесь отправить еще один запрос в последовательности, я могу повторно использовать сокет открыт в первый раз

Это HttpURLConnection делает объединение пулов.

+0

Итак, как мы можем отправить сообщение CLOSE на сервер/сокет с клиентской стороны? – Shivv

+0

@Shivv В HTTP нет сообщения CLOSE. – EJP

+0

то почему мы используем http.disconnect()? – Shivv

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

  • Нет связанных вопросов^_^