0

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

//...
while (true)
         {
            final Socket s = ss.accept();
            pool.execute(new Service(s));
         }
// ..

Service.class从输入流中获取字节并将字节发送到 otputstream。并关闭 Socket s

克莱特

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

接下来的问题是:我可以在客户端打开套接字,发送消息,接收消息,并在一段时间后发送新消息并接收新消息。没有重新打开套接字?

4

2 回答 2

2

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

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

于 2012-04-13T13:33:09.083 回答
0

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

于 2012-04-13T13:18:59.337 回答