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

标签 java performance sockets network-programming tcpclient

我有一个 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/

相关文章:

java - 如果插件由 JAR 创建,则不会调用激活器

java - java 中的示例 Web 应用程序,在 web.xml 中具有安全约束

JavaScript:是否可以预加载外部站点?

json - Crystal : slow json serialization of structs containing large strings

c - 生成 ip + udp header 时出现段错误

linux - 套接字 : Protocol not supported error

java - 添加到最后?

java - 通过解码 Base64 播放音频

Android HTML Jsoup解析速度

python - 每次有新人连接到我的 Twisted 套接字时,属性都会重置 [python]