Android,Java,socket,确定远程主机断开连接

时间:2016-04-27 16:46:58

标签: java android sockets block

我试图在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

) {

1 个答案:

答案 0 :(得分:0)

如何检测远程对等/套接字是否已关闭连接的问题是answered here以及here。 基本上,答案建议您尝试从套接字读取,然后观察发生的情况(read()返回-1,或readLine()返回null或您的读取方法引发{ {1}}。