我正在尝试在Android上打开一个Socket,但每次尝试时,无论我尝试什么方式,我都会不断收到连接拒绝错误。
在我尝试创建连接的以下代码行中发生错误。
Socket socket = new Socket(getLocalIpAddressString(), 8008);
以下是我用来获取本地IP地址的方法:
public static String getLocalIpAddressString() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("IPADDRESS", ex.toString());
}
return null;
}
我得到的错误是:
WARN/System.err(3574): java.net.ConnectException: /192.168.2.163:8008 - Connection refused
WARN/System.err(3574): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:237)
WARN/System.err(3574): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:199)
WARN/System.err(3574): at java.net.Socket.startupSocket(Socket.java:734)
WARN/System.err(3574): at java.net.Socket.<init>(Socket.java:157)
WARN/System.err(3574): at com.networks.phone.engine.SIPEngine.rtpTest(SIPEngine.java:1444)
我认为我的Ipaddress和/或端口有错误?但是,任何人都能指出我可能是什么原因的正确方向吗?
答案 0 :(得分:2)
在其清单中声明网络权限的正确编码的Android应用程序可以接受未充分利用的端口上的连接,因为设备上没有防火墙。
但是,许多wifi和大多数移动网络都会将设备置于NAT和外部防火墙之后,因此入站连接尝试可能永远无法到达。
答案 1 :(得分:2)
我在提示符中使用了ipconfig命令,然后使用“IPv4地址”连接到当前的PC。
我已成功连接服务器以及已发送&amp;收到的字节。
Android客户端代码:
s = new Socket("192.168.42.85",12345);
PC服务器端代码:
socket = ss.accept();
InetAddress ia = socket.getInetAddress();
System.out.println("Client Address: " + ia.getHostAddress());
答案 2 :(得分:1)
就我而言,我需要重定向端口,看看:
http://developer.android.com/guide/developing/tools/emulator.html#redirections
或许您也可以尝试转发端口。
答案 3 :(得分:0)
从您的代码中,我假设您正在尝试从Android应用程序打开到同一Android设备的套接字连接。
基于Linux和所有,也许Android有某种防火墙或连接规则阻止您的套接字成功连接。查看文档,它可能是Android配置问题,而不是Java问题。
答案 4 :(得分:0)
我遇到了同样的问题。我不得不使用ServerSocket而不是Socket:
ServerSocket socket = new ServerSocker(8888);