我正在尝试连接到这样的套接字:
try {
Server = "192.168.0.10";
port = 7000;
System.out.println("SOCKET: Create Socket: " + Server+ ":" + port);
socket = new Socket(Server, port);
System.out.println("SOCKET: Created Socket: " );
out = socket.getOutputStream();
in = socket.getInputStream();
return true;
} catch (IOException ex) {
System.out.println("SOCKET: CATCH: " + ex.getLocalizedMessage());
return false;
}
这在我的Android 4.2设备上运行正常。如果我在Android Lollipop(5.x)上测试相同的代码,我将得到以下错误:
05-20 08:25:59.592: E/Con(8167): java.net.ConnectException: failed to connect to /192.168.0.10 (port 7000): connect failed: ETIMEDOUT (Connection timed out)
05-20 08:25:59.592: E/Con(8167): at libcore.io.IoBridge.connect(IoBridge.java:124)
05-20 08:25:59.592: E/Con(8167): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
05-20 08:25:59.592: E/Con(8167): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
05-20 08:25:59.592: E/Con(8167): at java.net.Socket.startupSocket(Socket.java:590)
05-20 08:25:59.592: E/Con(8167): at java.net.Socket.tryAllAddresses(Socket.java:128)
05-20 08:25:59.592: E/Con(8167): at java.net.Socket.<init>(Socket.java:178)
05-20 08:25:59.592: E/Con(8167): at java.net.Socket.<init>(Socket.java:150)
在这两种情况下,我的Android设备都通过wifi与同一设备连接。有没有人知道Lollipop的问题?
谢谢!
编辑:解决方法: 好吧,我注意到一个奇怪的行为:如果我关闭我的移动互联网数据,正在创建Socket!但我只需要移动数据,因此它不是一个令人满意的解决方案...有关如何创建移动数据套接字的任何想法?
答案 0 :(得分:1)
我们遇到了同样的问题。我们解决了这个问题:
ConnectivityManager conMan = (ConnectivityManager) Context.getSystemService(CONNECTIVITY_SERVICE);
NetworkRequest.Builder nb = new NetworkRequest.Builder();
nb.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
conMan.requestNetwork(nb.build(), new ConnectivityManager.NetworkCallback() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onAvailable(Network network) {
Socket s = new Socket();
network.bindSocket(s);
s.bind(new InetSocketAddress(server, port));
}
});
使用Network.bindSocket(套接字),您可以主动选择要用于该套接字的网络。这是必要的,因为从Lollipop开始,系统默认网络是连接到互联网的网络。