gpt4 book ai didi

java - 我应该关闭tcp连接吗?

转载 作者:行者123 更新时间:2023-12-02 02:21:42 24 4
gpt4 key购买 nike

我有一个 Java 打印应用程序,它使用原始 TCP 套接字将票据打印到网络打印机。该应用程序是一个 REST 监听器,当它收到命令时,它会使用与单个以太网热敏打印机的单个连接进行打印。

这是我的单例服务使用的代码:

public class TcpPrinterWrapper implements PrinterWrapper {

private static Logger log = LoggerFactory.getLogger(TcpPrinterWrapper.class);

private PrinterOpzioni opzioni;
private TcpWrapper wrapper;


public TcpPrinterWrapper(PrinterOpzioni opzioni) {
super();
this.opzioni = opzioni;
wrapper=new TcpWrapper();
}



@Override
protected void finalize() throws Throwable {
if(wrapper!=null) try{wrapper.close();}catch (Exception e) {}
super.finalize();
}


private void openPort(){
try {
if(wrapper==null)
wrapper=new TcpWrapper();
wrapper.openPort(opzioni, opzioni.getTcpTimeout());
} catch (Exception e) {
log.error("Errore apertura porta",e);
throw new HardwareException("Porta stampante non valida o non disponibile");
}
}

@Override
public synchronized void print(byte[] content, boolean close) throws Exception {
try{
if(wrapper==null || !wrapper.isOpened()){
openPort();
}
wrapper.write(content);
if(close)
close();
}catch(Exception e){
try{
wrapper.close();
}catch(Exception e1){}
throw e;
}
}

@Override
public void close(){
try {
wrapper.close();
wrapper=null;
} catch (Exception e) {}
}

}

My question is: should it close its socket at the end of each print job? Or can a TCP socket stay opened for many hours waiting for jobs?

我不知道 REST 请求的频率,但我确信它们可以等待很多小时,但也可以在一分钟内调用很多。这就是为什么我无法回答,套接字可以保持打开状态等待这么长时间吗?另一方面,我可以在几分钟内打开/关闭/打开/关闭许多套接字吗?我应该使断开连接计时器复杂化吗?

最佳答案

您没有使用原始套接字(不可能使用现有的 Java 网络标准包;您需要在 JNI 的帮助下使用 native 调用来利用原始套接字)。

您在代码中使用的似乎是具有从Java标准包的TCP套接字扩展的TCPSocket的PrintServer。而且,还有太多代码没有共享。

My question is: should it close its socket at the end of each print job? Or can a TCP socket stay opened for many hours waiting for jobs?

理想情况下,每个应用程序都应该有进程超时,或者在一段时间后释放资源。在请求等待情况下关闭 session 是安全的一般原则(和最佳实践)。通过过程,我的意思是底层资源如果不被使用应该关闭连接或/并给出超时(取决于应用程序的用例)。

所以,是的,如果类 TcpWrapper 扩展了类 Socket,您应该设置连接超时和读取超时。最重要的是:“一旦操作完成,就应该关闭客户端和服务器端的Socket”。

您可以利用套接字池来管理打印应用程序的多个连接,如帖子 Manage Client Socket Pool 中所述。 .

关于java - 我应该关闭tcp连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com