你如何调试挂机插座连接?

时间:2009-10-15 15:09:25

标签: java sockets

我们正在连接到Web服务,如下所示:

URL url = new URL("https://...");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-length", "" + data.length());
conn.setDoOutput(true);
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());

有时,连接会在最后一行挂起,并且会有很长或无限的超时。

我们如何才能进入这个并找出正在发生的事情? (我们有很多猜测,但目前很少有人确认。)我们已经使用大量的日志记录语句(这就是我们知道停止点在哪里)来为我们的代码进行检测,但对于Java来说却不能做同样的事情。库。我们可以说服这些课程告诉我们哪些其他信息?如果我们想设置超时,我们将如何做?

我们如何调试?

2 个答案:

答案 0 :(得分:4)

如果您使用Sun的JSSE提供程序来支持SSL(这是在Sun运行时中使用“https:”URL时的默认行为),则可以设置javax.net.debug系统属性以查看SSL的进度握手。

有关可以使用的值的详细信息在the JSSE reference guide;中打开所有 SSL调试,请使用类似

的内容
java -Djavax.net.debug=all com.y.MyClass

由于大多数初始握手都是未加密的,因此如果您熟悉SSL,像Wireshark这样的工具也非常有用。如果你有服务器私钥,那么Wireshark也应该能够解密一个会话(只要你没有使用短暂的密码套件),但我从来没有能够让它工作。

答案 1 :(得分:0)

由于Keep-Alive连接,您可能会陷入困境。尝试强制连接关闭......

URL url = new URL("https://...");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "close");
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-length", "" + data.length());
conn.setDoOutput(true);
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());