我试图在android java中编写TCP客户端代码。大多数工作正常。但我有一个问题。如果套接字已连接且remeote主机关闭或网络出现故障或其他原因,则socket.getinputstream会一直阻塞。
我不知道插座是否仍然连接。我也在objective-c中编码,在objective-c中我得到一个套接字强制关闭的事件,我可以尝试重新连接。所以在目标c上,套接字跟踪状态。
在java中,套接字和输入流仍然连接或阻塞,即使套接字已关闭。如何检查插座是否仍然连接?
@Override
protected Void doInBackground(String... params) {
try {
String host = params[0];
int port = Integer.parseInt(params[1]);
SocketAddress sockaddr = new InetSocketAddress(host, port);
Socket socket = new Socket();
socket.connect(sockaddr,5000);
socket.setSoTimeout(7000);
out = new PrintWriter(socket.getOutputStream(), true);
mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (mRun) {
try {
-----> mServerMessage = mBufferIn.readLine();
}catch (Exception e){
Log.d("my","hier3" + e.getMessage());
}
if (mServerMessage.trim() != null) {
sender.messageReceived(s2);
}else{
}
}
}
} catch (UnknownHostException e
) {
答案 0 :(得分:0)
如何检测远程对等/套接字是否已关闭连接的问题是answered here以及here。
基本上,答案建议您尝试从套接字读取,然后观察发生的情况(read()
返回-1
,或readLine()
返回null
或您的读取方法引发{ {1}}。