我应该关闭 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 非常无用。查一下。