Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何断开/重新启动与脆弱套接字服务器的客户端连接 我有java代码,它通过C++编写的服务器通过套接字进行请求。通信只是java代码为请求写一行,然后服务器写一行作为响应,但有时服务器似乎没有响应,因此我实现了一个基于ExecutorService的超时,它尝试断开并重新启动连接_Java_Sockets - Fatal编程技术网

如何断开/重新启动与脆弱套接字服务器的客户端连接 我有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()也被阻止),这对我没有帮助-正确吗?