java - 客户端-服务器应用程序。总是打开套接字

标签 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 从输入流中获取字节并将字节发送到 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/

相关文章:

串行服务客户端的 Java 套接字服务器

java - 无法捕获通过 GET 请求传递的参数

java - 将字节数组转换为字符串

c++ - 使用 printf 右对齐包括前缀的数字

c++ - 与 Python 一起运行 C++ 代码并与之交互

c - 收集未知数量的消息,然后继续执行程序

java - Android NIO 服务器选择器在没有消息发送时读取

java - 如何使用 Kryo 将非常大的 Java 对象保存到 Oracle 中的 Blob 中并避免 KryoException 缓冲区溢出?

java - 是否有 Java for-each 循环接受的最通用的 "iterable"类型?

c++ - 如何使用 C 或 C++ 将 .caf 文件转换为 .wav?