我已经编写了一个客户端来在android设备(android 6)上运行,并且当服务器启动并运行时它会连接,但是当服务器关闭时,socket()调用应该引发异常,但不会。
我最初使用NDK进行了尝试,但遇到了非常相似的问题(Android NDK socket connect() returning 0 when it should fail whilst on 3g)。
我现在认为这是android的一个错误,但是对解决方案或变通方法的任何见解将不胜感激。
相关代码:
public class Client implements Runnable{
private Socket socket;
private InetAddress IP;
private int port;
public Client(int port){
try {
this.IP = InetAddress.getByName(server ip);
}
catch(UnknownHostException e){
Log.d("App1", "Unknown Host, connection failed");
System.exit(1);
}
this.port = port;
Log.d("App1", "initialised");
}
@Override
public void run(){
try {
this.socket = new Socket(this.IP, this.port);
Log.d("FiX1", "Connected");
listen();
}
catch(IOException e){
Log.d("FiX1,","connection failed");
System.exit(1);
}
finally
{
try{
socket.close(); // dispose
}
catch(IOException e){
System.exit(1);
}
}
}
public void listen() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String cominginText = "";
try {
cominginText = in.readLine();
Log.d("FiX1",cominginText);
} catch (IOException e) {
//error ("System: " + "Connection to server lost!");
System.exit(1);
break;
}
}
} catch (IOException e) {
System.exit(1);
}
}
}
答案 0 :(得分:0)
您应该尝试从套接字读取。
也没有例外,因为没有输入或输出。
在其他线程超时的情况下尝试socket.getInetAddress().isReachable(int timeout)
或socket.getInputStream().read()
。
socket.getInputStream()。read()正在阻止调用,因此它将一直阻止直到某些数据到达输入流为止。
答案 1 :(得分:0)
我能找到的最佳解决方案是从服务器手动发送一个确认已建立连接的确认,如果客户端在声称已连接后的一定时间内未收到此消息,则客户端将重试该连接。 / p>
答案 2 :(得分:-1)
TCP连接“关闭”与“断开连接”之间存在区别。 如果您使用socket.close()从服务器关闭套接字连接,则尝试从该连接读取消息时,客户端将出现异常,反之亦然。
但是,如果一侧消失(关闭程序),那么另一侧将无法得知。因此,另一端将等待读取呼叫的响应。
TCP协议旨在在恶劣的通信环境中可靠,并且通常不会因为一段时间没有收到对方的声音而决定关闭连接。