客户服务器应用程序。始终打开插座

时间:2012-04-13 13:07:12

标签: java c++ sockets client-server

我有客户端服务器应用程序 - C ++上的客户端(在AIX上运行,使用库)和Java上的服务器(在Win和AIX上运行,使用java.net。,java.io。 )。 申请结构如下 服务器

//...
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 个答案:

答案 0 :(得分:2)

当然可以。但是,服务器应该理解预期会有多条消息,并且在客户端关闭连接之前不应该终止服务。您的实现的问题是Service是Runnable而不是Thread。如果它会在接收消息时循环,它将保持正在运行的线程。如果您使用FixedThreadPool,这可能会导致所有池线程都耗尽并且下一个Service将等到上一个客户端之一断开连接。使用CachedThreadPool避免了这种情况,但结果是,使用的线程数等于客户端数。如果你有足够的主内存(每个线程大约使用0.5 Mb),这不是问题。如果要节省内存,可以使用Apache Netty等异步网络库。 Java 7实现了异步通道。

https://github.com/rfqu/df4j是一个轻量级数据流库,它包含一个基于Java7异步网络工具的包装器,以使它们更易于使用。

答案 1 :(得分:0)

是的确定。除了HTTP,大多数协议使用持久连接(SMTP,POP3,FTP,ICQ,.....)