我有一个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) {}
    }

}



  我的问题是:是否应在每次打印结束时关闭其插槽
  工作?还是可以将TCP套接字保持打开状态以等待工作几个小时?


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

最佳答案

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

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


  我的问题是:是否应在每次打印结束时关闭其插槽
  工作?还是可以将TCP套接字保持打开状态以等待工作几个小时?


理想情况下,每个应用程序应具有进程超时,或在一定时间后释放资源。在等待请求的情况下关闭会话是安全性(以及最佳做法)的一般原则。通过过程,我的意思是基础资源(如果未使用)应该关闭连接或/并给出超时(取决于应用程序的用例)。

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

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

10-05 21:12
查看更多