如何断开/重新启动与脆弱套接字服务器的客户端连接 我有java代码,它通过C++编写的服务器通过套接字进行请求。通信只是java代码为请求写一行,然后服务器写一行作为响应,但有时服务器似乎没有响应,因此我实现了一个基于ExecutorService的超时,它尝试断开并重新启动连接
要使用我保持的连接,请执行以下操作:如何断开/重新启动与脆弱套接字服务器的客户端连接 我有java代码,它通过C++编写的服务器通过套接字进行请求。通信只是java代码为请求写一行,然后服务器写一行作为响应,但有时服务器似乎没有响应,因此我实现了一个基于ExecutorService的超时,它尝试断开并重新启动连接,java,sockets,Java,Sockets,要使用我保持的连接,请执行以下操作: Socket server; PrintWriter out; BufferedReader in; 因此,建立连接需要: server = new Socket(hostname, port); out = new PrintWriter(new OutputStreamWriter(server.getOutputStream())); in = new BufferedReader(new InputStreamReader(socket.getIn
Socket server;
PrintWriter out;
BufferedReader in;
因此,建立连接需要:
server = new Socket(hostname, port);
out = new PrintWriter(new OutputStreamWriter(server.getOutputStream()));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
如果不是超时代码,请求/接收步骤如下:
String request="some request";
out.println(request);
out.flush();
String response = in.readLine();
当我收到超时时,我正试图关闭与以下设备的连接:
in.close();
out.close();
socket.close();
但其中一次关闭似乎会受阻,永远不会回来。有人能告诉我为什么其中一个会阻塞,以及放弃连接而不导致资源泄漏问题的正确方法是什么吗?关闭封装套接字的缓冲读写器将关闭套接字。
关闭已关闭的套接字是不正确的,但这不应该是问题 无论如何,根据java socket: 一旦插座关闭,它就无法用于进一步的网络使用(即无法重新连接或反弹)。需要创建一个新的套接字 因此,在关闭此套接字对象后,需要创建一个新的套接字对象
就您的内存管理而言,垃圾处理程序应该为您杀死旧的垃圾处理程序,因此不要担心泄漏。关闭封装套接字的缓冲读写器将关闭套接字。
关闭已关闭的套接字是不正确的,但这不应该是问题 无论如何,根据java socket: 一旦插座关闭,它就无法用于进一步的网络使用(即无法重新连接或反弹)。需要创建一个新的套接字 因此,在关闭此套接字对象后,需要创建一个新的套接字对象 就内存管理而言,垃圾处理程序应该为您杀死旧的垃圾处理程序,因此不要担心泄漏。对out.close()的调用可能会被阻塞,因为PrintWriter.close()方法与println(String)方法在同一个锁上同步。如果对println的原始调用在尝试写入错误连接时被阻止,则无法对其调用close() 您是否尝试过使用Socket.setSoTimeout()方法?对out.close()的调用可能会被阻止,因为PrintWriter.close()方法与println(String)方法在同一个锁上同步。如果对println的原始调用在尝试写入错误连接时被阻止,则无法对其调用close()
您是否尝试过使用Socket.setSoTimeout()方法?我认为您只需要关闭套接字(然后相应地处理读/写线程中的任何异常)。另外,如上所述,从头开始重新创建套接字。我认为您只需要关闭套接字(然后相应地处理读/写线程中的任何异常)。另外,如上所述,从头开始重新创建套接字。我没有尝试调用setSoTimeout(),但是听起来它只影响读调用,如果我在写调用中被阻止(这听起来像是我被赋予了out.close()也被阻止),这对我没有帮助-正确吗?我没有尝试调用setSoTimeout(),但是,这听起来好像只影响读调用,如果我在写调用中被阻止(这听起来像是给了我out.close()也被阻止),这对我没有帮助-正确吗?