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, 发送消息、接收消息并在一段时间后发送新消息 并接收新消息。 没有重新打开插座
# 1 楼答案
当然可以。然而,服务器应该理解预期会有多条消息,并且在客户端关闭连接之前不应该终止服务。实现的问题在于,服务是可运行的,而不是线程。如果它在接收消息时循环,它将保持正在运行的线程。如果使用FixedThreadPool,则可能会出现这样的情况:所有池线程都已耗尽,下一个服务将等待前一个客户端断开连接。使用CachedThreadPool可以避免这种情况,但结果是,使用的线程数等于客户端数。如果有足够的主内存(每个线程大约使用0.5 Mb),这就不是问题。如果想节省内存,可以使用ApacheNetty等异步网络库。Java7实现了异步通道
https://github.com/rfqu/df4j是一个轻量级数据流库,其中包括一个Java7异步网络工具包装器,使其更易于使用
# 2 楼答案
当然可以。除了HTTP,大多数协议使用持久连接(SMTP、POP3、FTP、ICQ等)