[英]Java Socket connecting to a public ip-address
我需要創建一個連接到服務器的服務器和客戶端。
問題 :“服務器工作。客戶端只能連接到localhost,它無法連接到Internet上的服務器。我希望客戶端通過托管服務器的公共IP地址連接到服務器。”
首先,我確保端口已轉發並且可以訪問我已經測試了端口,其次我已經完全禁用了服務器計算機上的防火牆。
下面是我正在使用的測試代碼:
服務器:沒有什么特別的簡單 - 如果連接客戶端則終止,否則只是等待連接。
public class Server {
public static void main(String args[]) {
try {
ServerSocket srvr = new ServerSocket(52000);
srvr.accept();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
客戶端:我使用no-ip.com將服務器的ip掩碼為“biogenserver2.noip.me”。 使用.getCanonicalHostName(); 將返回IP。
public class Client {
public static void main(String args[]) {
try {
String ip = Inet4Address.getByName("somets.noip.com").getCanonicalHostName();
InetSocketAddress sa = new InetSocketAddress(ip, 52000);
//Socket skt = new Socket("0.0.0.0", 52000); //local - this works fine.
Socket skt = new Socket();
skt.connect(sa);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
當我運行它時,服務器連接正常,但客戶端返回“連接超時”異常
任何幫助將不勝感激。 謝謝。
回答:
“為了清楚起見:您已經檢查過端口是否通過公共IP打開,由no-ip返回,當您運行那個小型testclient(在不是服務器計算機的計算機上)時,服務器將毫無例外地退出 - 這是正確的嗎? “ - Fildor
TL:DR
不要在同一台計算機上運行客戶端和服務器,並且嘗試通過公共IP連接到服務器然后到您自己的本地網絡的同一網絡將導致客戶端超時異常
我在同一台機器上運行客戶端和服務器,也在同一個網絡上運行。 這導致客戶端超時異常。 我嘗試在不同的計算機和不同的網絡上運行客戶端,我能夠成功連接。
您的應用程序使用什么版本的IP協議? 在linux上,你可以用netstat -tunap | grep 52000
來解決它 netstat -tunap | grep 52000
並觀察第一個字段是tcp
還是tcp6
。 如果是后者,則可能存在IPv6連接問題,您可能希望通過將-Djava.net.preferIPv4Stack=true
指定為JVM來使用IPv4到IPv6。
在服務器接受客戶端之前,3次握手完成並且客戶端超時可能需要一些時間
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.