服务器应用程序.始终打开的插座

clien-server application. Always opened socket

本文关键字:插座 应用程序 服务器      更新时间:2023-10-16

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

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

服务.class从输入链中获取字节并将字节发送到 otputstream。并关闭套接字 s

克莱因特

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

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

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

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

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