2012-02-18 2 views
2

Я читаю строку из буфера и записываю ее на сервер. Проблема, с которой я сталкиваюсь, заключается в том, что строка никогда не получает сервер, когда я оставляю сокет открытым и записываю в цикле. Когда я использую это:Java-клиентский сокет с использованием writeBytes

try {  
     Socket send = new Socket("localhost", 1490); 
     DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
     String message = null; 
     while ((message = buffer.get()) != null){ 
      out.writeBytes(message); 
     } 
     out.close(); 
     send.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

сервер не получает строку, но когда я делаю это работает должным образом:

try {  

     String message = null; 
     while ((message = buffer.get()) != null){ 
      Socket send = new Socket("localhost", 1490); 
      DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
        out.writeBytes(message); 
      out.close(); 
      send.close(); 
     } 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

Очевидно, что я не хочу, чтобы держать открытие и закрытие сокет. В чем проблема?

ответ

0

Данные не записываются в розетку даже при ее закрытии? (в вашем первом фрагменте, который есть)

Кроме того, вы пытались использовать метод flush? Вы можете прочитать об этом здесь: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush(), и ваш код будет выглядеть следующим образом:

try {  
    Socket send = new Socket("localhost", 1490); 
    DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
    String message = null; 
    while ((message = buffer.get()) != null){ 
     out.writeBytes(message); 
     out.flush(); 
    } 
    out.close(); 
    send.close(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

Да, я попытался выполнить флеш, и у меня все еще есть такая же проблема. У буфера всегда есть строки, поэтому я не думаю, что сокет фактически закрывается. Но почему мое сообщение еще не получено? – user1190650

1

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

0

Позвольте мне предположить.

Выполняется ли блок buffer.get()? Если это так, то проблема заключается в том, что out.writeBytes(message) не гарантирует, что все байтовые представления будут перенесены на сервер. Вместо. есть хороший шанс, что ваш клиент имеет буферизованные байты, ожидающие, чтобы их пропустили на сервер.

Если это то, что происходит, то вызов по умолчанию после каждого звонка до writeBytes устранит проблему.

Но если метод buffer.get() не блокирует, то вызов флеша не будет иметь никакого значения. Фактически, это просто увеличит сетевой трафик. Поэтому добавление флеша «на всякий случай» - плохая идея.


Другая возможность заключается в том, что с серверным кодом что-то не так.

+0

Спасибо. Да, buffer.get() блокирует, но я попытался сбросить буфер после каждого вызова writeBytes, и у меня все еще есть та же проблема. Любые другие идеи? – user1190650

+0

Прочтите последнее предложение моего ответа еще раз. –

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