簡體   English   中英

客戶端套接字創建掛在jdk1.8.0_25上

[英]Client socket creation hangs on jdk1.8.0_25

我們有一個連接到游戲服務器的小程序。 從兩天以來,我們收到用戶抱怨無法連接。 我將問題歸結為以下代碼:

System.err.println("<PO> creating socket host=" + host + ", port=" + port);
try {
    socket = new Socket(host, port);
} catch (Throwable t) {
    System.err.println("<PO> OOPS: " + t.getMessage());
    t.printStackTrace();
}
System.err.println("<PO> socket created");

輸出如下:

<PO> creating socket host=<host deleted>, port=7754

然后小程序掛起(不使用cpu)。 也不例外,但是也沒有“套接字創建”的打印! 請注意,此代碼已經成功運行了很多年(當然沒有打印和嘗試/捕獲)。 使用Java 1.7,它仍然可以正常運行,但是使用Java 1.8.0_25,代碼將掛起。

在什么情況下“新套接字”調用可以掛起?

是否有人對如何進一步調試此問題有任何建議?

我發現與strace相關的系統調用:

socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 53
setsockopt(53, SOL_IPV6, IPV6_V6ONLY, [0], 4) = 0
fcntl(53, F_GETFL)                      = 0x2 (flags O_RDWR)
fcntl(53, F_SETFL, O_RDWR|O_NONBLOCK)   = 0
connect(53, {sa_family=AF_INET6, sin6_port=htons(7754), inet_pton(AF_INET6, "::ffff:<server ip in v4 format>", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=53, events=POLLOUT}], 1, 120000) = 1 ([{fd=53, revents=POLLOUT}])
getsockopt(53, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
fcntl(53, F_GETFL)                      = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(53, F_SETFL, O_RDWR)              = 0
getsockname(53, {sa_family=AF_INET6, sin6_port=htons(52535), inet_pton(AF_INET6, "::ffff:<client ip in v4 format>", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
setsockopt(53, SOL_TCP, TCP_NODELAY, [1], 4) = 0

我懷疑是'setsocketopt(... IPV6_V6ONLY ...)'調用:服務器絕對僅是IPV4! 知道如何強制Java使用IPv4(或至少阻止Java使用IPV6_V6ONLY)嗎?

我已經找到了原因和解決方案,所以現在該回答我自己的問題,以幫助其他在此頁面上遇到同樣問題的可憐人。

問題的根源在於,在Java 8中,以“沙盒”模式簽名的Applet不再接收“ SocketPermission”,而僅接收“ URLPermission”。

當您調用“ socket.connect()”(或執行連接的“新套接字(主機,端口)”)時,發生了一些魔術,Java決定您必須打開http連接。 然后,它嘗試使用http協議通過您的套接字獲取“ /crossdomain.xml”文件。

這就是破壞我的代碼的原因:我的自定義游戲服務器不會講http,並且在保持套接字打開的同時沒有提供答案。 Java嘗試讀取未收到的響應,並且'socket.connect()'調用從未返回。

“解決方案”是小程序必須在“所有權限”模式下運行才能打開常規套接字。 具有諷刺意味的是,Java 8中嚴格的安全性實際上迫使我們啟用“所有權限”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM