我有客户端服务器应用程序 - C++ 上的客户端(在 AIX 上运行,使用库)和 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);
}
接下来是问题:我可以在客户端打开套接字吗? 发送消息,接收消息,一段时间后发送新消息 并收到新消息。 没有重新打开套接字?
最佳答案
当然可以。然而,服务器应该理解不止一条消息是预期的,并且在客户端关闭连接之前不应该终止服务。您的实现的问题是服务是可运行的而不是线程。如果它在接收消息时循环,它会保持它正在运行的线程。如果您使用 FixedThreadPool,这可能会导致所有池线程都耗尽并且下一个服务将等到前一个客户端断开连接。使用 CachedThreadPool 可以避免这种情况,但结果是,使用的线程数等于客户端数。如果您有足够的主内存(每个线程大约使用 0.5 Mb),这不是问题。如果你想节省内存,你可以使用像 Apache Netty 这样的异步网络库。 Java 7 实现了异步 channel 。
https://github.com/rfqu/df4j是一个轻量级数据流库,其中包含一个 Java7 异步网络设施的包装器,使它们更易于使用。
关于java - 客户端-服务器应用程序。总是打开套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10141431/