我有客户端服务器应用程序 - C ++上的客户端(在AIX上运行,使用库)和Java上的服务器(在Win和AIX上运行,使用java.net。,java.io。 )。 申请结构如下 服务器
//...
while (true)
{
final Socket s = ss.accept();
pool.execute(new Service(s));
}
// ..
Service.class 从输入strean获取字节并将字节发送到otputstream。 关闭套接字
Cleint 是
SendMessage(msg)
{
// ...
const int socketFD = OpenSocket();
// send bytes
// receive bytes
close(socketFD);
}
问题是下一个:我可以在客户端打开套接字, 发送消息,接收消息,并在一段时间后发送新的消息 并收到新消息。 没有重新打开套接字?
答案 0 :(得分:2)
当然可以。但是,服务器应该理解预期会有多条消息,并且在客户端关闭连接之前不应该终止服务。您的实现的问题是Service是Runnable而不是Thread。如果它会在接收消息时循环,它将保持正在运行的线程。如果您使用FixedThreadPool,这可能会导致所有池线程都耗尽并且下一个Service将等到上一个客户端之一断开连接。使用CachedThreadPool避免了这种情况,但结果是,使用的线程数等于客户端数。如果你有足够的主内存(每个线程大约使用0.5 Mb),这不是问题。如果要节省内存,可以使用Apache Netty等异步网络库。 Java 7实现了异步通道。
https://github.com/rfqu/df4j是一个轻量级数据流库,它包含一个基于Java7异步网络工具的包装器,以使它们更易于使用。
答案 1 :(得分:0)
是的确定。除了HTTP,大多数协议使用持久连接(SMTP,POP3,FTP,ICQ,.....)