2012-04-13 2 views
0

У меня есть клиентское серверное приложение - клиент на C++ (работает в AIX, используя библиотеку) и сервер на Java (работает на Win и AIX, используя java.net. , java.io.). Структура приложения следующая
clien-server application. Всегда открыт сокет

лицо, вручающее судебные документы
//... 
while (true) 
     { 
      final Socket s = ss.accept(); 
      pool.execute(new Service(s)); 
     } 
// .. 

Service.class Получить байт из входного strean и отправить байт otputstream. и ЗАКРЫТЬ сокет сек

Cleint является

SendMessage(msg) 
{ 
// ... 
    const int socketFD = OpenSocket(); 
// send bytes 
// receive bytes 
    close(socketFD); 
} 

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

ответ

2

Уверен, что вы можете. Сервер, однако, должен понимать, что ожидается более одного сообщения, и не следует убивать службу, пока клиент не закроет соединение. Проблема с вашей реализацией заключается в том, что Service является Runnable, а не Thread. Если он будет циклически принимать сообщения, он будет поддерживать поток, на котором он запущен. Если вы используете FixedThreadPool, это может привести к ситуации, когда все потоки пулов исчерпаны, а следующая служба будет ждать, пока один из предыдущих клиентов не отключится. Использование CachedThreadPool позволяет избежать этого, но в результате количество используемых потоков равно количеству клиентов. Это не проблема, если у вас достаточно основной памяти (каждый поток использует примерно 0,5 Мб). Если вы хотите сохранить память, вы можете использовать асинхронные сетевые библиотеки, такие как Apache Netty. В Java 7 реализованы асинхронные каналы.

https://github.com/rfqu/df4j - это легкая библиотека потока данных, которая включает в себя оболочку через асинхронные сети Java7, чтобы упростить их использование.

0

Да, конечно. Помимо протокола HTTP большинство протоколов используют постоянные соединения (SMTP, POP3, FTP, ICQ, .....)

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