我应该关闭 tcp 连接吗?
Should I close the tcp connection?
我有一个 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 请求的频率,但我确定他们可以等待很多小时,但在一分钟内也会被调用很多次。这就是为什么我无法回答,套接字可以保持打开状态等待这么久吗?另一方面,我可以在几分钟内 open/close/open/close 多个套接字吗?我应该使用断开连接计时器吗?
您没有使用原始套接字(不可能使用现有 Java 的网络标准包;您需要在 JNI 的帮助下使用本机调用来使用原始套接字)。
您在代码中使用的似乎是具有从 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?
理想情况下,每个应用程序都应该有进程超时,或者在一定时间后释放资源。在请求等待情况下关闭会话是安全的一般原则(和最佳实践)。通过过程,我的意思是底层资源如果不被使用应该关闭连接 or/and 给出超时(取决于应用程序的用例)。
所以,是的,如果 class TcpWrapper
扩展了 class 套接字,您应该设置连接超时以及读取超时。最重要的是:"Once the operation is done, you should close the Socket at both the client and the Server end".
您可以使用套接字池来管理打印应用程序的多个连接,如 post 中所述。
这也取决于打印机。它会打印它收到的每个字符吗?当它收到一个完整的行时,它会累积行打印它们吗?还是等待完整的页面?还是为了完成工作?在那种情况下,根据打印机协议,您可能必须关闭打印机的套接字才能意识到这是打印作业的结束。
另一方面:在许多企业环境中,防火墙会切断在特定(可配置)时间段内不活动的套接字。在这种情况下,您最好在作业结束时关闭套接字。
最后,finalize 非常无用。查一下。
我有一个 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 请求的频率,但我确定他们可以等待很多小时,但在一分钟内也会被调用很多次。这就是为什么我无法回答,套接字可以保持打开状态等待这么久吗?另一方面,我可以在几分钟内 open/close/open/close 多个套接字吗?我应该使用断开连接计时器吗?
您没有使用原始套接字(不可能使用现有 Java 的网络标准包;您需要在 JNI 的帮助下使用本机调用来使用原始套接字)。
您在代码中使用的似乎是具有从 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?
理想情况下,每个应用程序都应该有进程超时,或者在一定时间后释放资源。在请求等待情况下关闭会话是安全的一般原则(和最佳实践)。通过过程,我的意思是底层资源如果不被使用应该关闭连接 or/and 给出超时(取决于应用程序的用例)。
所以,是的,如果 class TcpWrapper
扩展了 class 套接字,您应该设置连接超时以及读取超时。最重要的是:"Once the operation is done, you should close the Socket at both the client and the Server end".
您可以使用套接字池来管理打印应用程序的多个连接,如 post
这也取决于打印机。它会打印它收到的每个字符吗?当它收到一个完整的行时,它会累积行打印它们吗?还是等待完整的页面?还是为了完成工作?在那种情况下,根据打印机协议,您可能必须关闭打印机的套接字才能意识到这是打印作业的结束。
另一方面:在许多企业环境中,防火墙会切断在特定(可配置)时间段内不活动的套接字。在这种情况下,您最好在作业结束时关闭套接字。
最后,finalize 非常无用。查一下。