Java读取超时不起作用

时间:2013-08-03 17:23:47

标签: java android sockets

我尝试使用android上的socket连接我的服务器。我希望它像这样工作;当我向服务器发送请求时,如果有响应,请调用我的响应函数。如果超时500毫秒发生(将检查异常和我设置的布尔值),我想执行另一个函数。但是使用此代码,当我向服务器发送内容并等待响应时,如果有响应则执行onServerResponse函数,并且在没有响应时不执行任何操作(挂起)。如何编辑此代码,以便在没有响应时抛出超时异常?

            boolean control = false;
            try{
                Socket socket = new Socket();
                socket.setSoTimeout(500);
                socket.connect(new InetSocketAddress(InetAddress.getByName(SERVER_IP),SERVER_PORT));
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
                bw.write("asdasd\n");
                bw.flush();
                control = true;
                int readInt = -1;
                String read = null;
                StringBuilder sb = new StringBuilder("");
                while((readInt = socket.getInputStream().read()) != -1){
                    sb.append((char)readInt);
                }
                read = sb.toString();
                if(read != null && read.trim().length() > 0){ onServerResponse(read); }
            }catch(Exception e){ Log.v("Main", "GOT AN ERROR: "+e+control); }

问题解决了,请参阅答案评论。

2 个答案:

答案 0 :(得分:2)

我不确定这是否能回答您的问题,但setSoTimeout仅适用于连接后套接字上的读取,而不是建立连接本身。为此,使用socket.connect(SocketAddress address, int timout)重载。)重载。你可能想要同时使用它们。

答案 1 :(得分:0)

这样的事情会起作用:

Socket socket = new Socket();
InetAddress addr = InetAddress.getByName(SERVER_IP);
SocketAddress sockaddr = new InetSocketAddress(addr, SERVER_PORT);
// 500ms is too short, up to you.
// normal time would be 5 to 20 seconds, depends on network (intranet/internet)
socket.connect(sockaddr, 500);
// 500ms to timeout reading from the socket
socket.setSoTimeout(500);