有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java客户端服务器应用程序。常开插座

<>我有客户机-服务器应用程序——C++上的客户端(运行在AIX上,使用库),java上的服务器(运行在Win和AIX上,使用java .net .EM>,java. Io.EEE>)。 下一步是应用程序的结构
服务器

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

服务。类从输入strean获取字节并将字节发送到otputstream并关闭插座s

Cleint

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

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


共 (2) 个答案

  1. # 1 楼答案

    当然可以。除了HTTP,大多数协议使用持久连接(SMTP、POP3、FTP、ICQ等)

  2. # 2 楼答案

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

    https://github.com/rfqu/df4j是一个轻量级数据流库,其中包括一个Java7异步网络工具包装器,使其更易于使用