【问题标题】:clien-server application. Always opened socket客户端-服务器应用程序。总是打开套接字
【发布时间】:2012-04-13 13:07:12
【问题描述】:

我有客户端服务器应用程序 - 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);
}  

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

【问题讨论】:

    标签: java c++ sockets client-server


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-06
        • 2019-03-17
        • 2014-01-14
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多