Java 使套接字连接在发送命令后等待响应

Java 使套接字连接在发送命令后等待响应,java,android,sockets,Java,Android,Sockets,在android应用程序中,我使用android服务创建套接字连接。这个想法是,当活动开始时,我正在连接到服务器,并且我将套接字连接保持打开状态,以便在应用程序的其他部分进行访问 现在我要做的是使用缓冲写入器向服务器写入命令。在写入之后,我要执行检查是否已经收到响应。我正在尝试使用while(inStream.available()==0)循环来实现这一点。然而,这是行不通的。如何让应用程序等待特定命令的响应,直到处理进一步的代码 连接到插座: public class connectS

在android应用程序中,我使用android服务创建套接字连接。这个想法是,当活动开始时,我正在连接到服务器,并且我将套接字连接保持打开状态,以便在应用程序的其他部分进行访问

现在我要做的是使用缓冲写入器向服务器写入命令。在写入之后,我要执行检查是否已经收到响应。我正在尝试使用
while(inStream.available()==0)
循环来实现这一点。然而,这是行不通的。如何让应用程序等待特定命令的响应,直到处理进一步的代码

连接到插座:

    public class connectSocket implements Runnable
{
    @Override
    public void run()
    {
        try
        {
            Log.v("DEV","SocketClass, connectSocket");
            SocketAddress socketAddress = new InetSocketAddress(SERVERIP,SERVERPORT);
            command = "authorization";

            try
            {
                socket = new Socket();
                socket.setTcpNoDelay(true);
                socket.setSoTimeout(5000);
                socket.connect(socketAddress, 5000);

                if (socket.isConnected())
                {
                    Log.v("DEV","SocketClass successfully connected!");

                    out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    inStream = new DataInputStream(socket.getInputStream());

                    int bytesRead;
                    int count = 1;

                    while ((bytesRead = in.read()) > 0 && count != 3)
                    {
                        if (count == 1)
                        {
                            out.write(command + "\r\n");
                            out.flush();
                        }

                        while (inStream.available() == 0)
                        {
                            Log.v("DEV", "sleep "+inStream.available());
                            android.os.SystemClock.sleep(100);
                        }

                        StringTokenizer filterToken = new StringTokenizer(in.readLine(), "^");
                        String temp = filterToken.nextToken();

                        Log.v("DEV", "SocketClass Tokenizer: "+temp);

                        if (temp.equals("cmd_main"))
                        {
                            response = filterToken.nextToken();

                            Intent ret = new Intent();
                            ret.setAction(Testas.RECEIVE_AUTHORIZATION);
                            ret.putExtra("response",response);
                            sendBroadcast(ret);
                            count = 2;
                        }

                        count++;
                    }
                }
            }

            catch (Exception e)
            {
                Log.e("TCP",e.toString());
            }
        }

        catch (Exception e)
        {
            Log.e("DEV",e.toString());
        }
    }
}
我想在这里等待答复:

    class trackerStatus implements Runnable
{
    @Override
    public void run()
    {
        Log.v("DEV", "Socket Class, trackerStatus");

        try
        {
            int bytesRead;
            boolean parse = true;
            command = "command";
            int count = 1;

            while ((bytesRead = in.read()) > 0 && parse)
            {
                if (count == 1)
                {
                    out.write(command + "\r\n");
                    out.flush();
                }

                while (inStream.available() == 0)
                {
                    ////this part is not working
                    Log.v("DEV", "sleep "+inStream.available());
                    android.os.SystemClock.sleep(100);
                }
                Log.v("DEV", "NoSleep "+inStream.available());
                response = in.readLine();

                Log.v("DEV","ReadLine: "+response);

                if (response == null || "".equals(response.trim()))
                {
                    Log.v("DEV","Test Empty");

                    Intent ret = new Intent(Testas.RECEIVE_TRACKER_STATUS);
                    ret.putExtra("status", "OFFLINE");
                    LocalBroadcastManager.getInstance(SocketService.this).sendBroadcast(ret);

                    parse = false;
                }

                else
                {
                    StringTokenizer filterToken = new StringTokenizer(response, "^");
                    String temp = filterToken.nextToken();

                    if (temp.equals("trackerinfo"))
                    {
                        StringTokenizer extraFilter = new StringTokenizer(response, "|");
                        temp = extraFilter.nextToken();
                        String[] separate = temp.split(":");

                        if (separate[1].equals(carId))
                        {
                            Intent ret = new Intent();
                            ret.setAction(Testas.RECEIVE_TRACKER_STATUS);
                            ret.putExtra("status", "ONLINE");
                            sendBroadcast(ret);
                            parse = false;
                        }

                    }
                }

                count++;
            }
        }

        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
把这些都拿走

            response = in.readLine();
留着吧。它将阻塞,直到数据可用或检测到流结束

把这些都拿走

            response = in.readLine();
留着吧。它将阻塞,直到数据可用或检测到流结束

把这些都拿走

            response = in.readLine();
留着吧。它将阻塞,直到数据可用或检测到流结束

把这些都拿走

            response = in.readLine();

留着吧。它将一直阻止,直到数据可用或检测到流结束。

请阅读available()的文档,实现在数据可用的情况下始终返回0是完全合法的。这就是我在这里询问的原因。也许有人知道如何等到数据可用后再处理下一个代码吗?指定“不工作”的含义将大大有助于回答这个问题。你发现实际发生的事情和你需要发生的事情之间有什么区别?没关系,那是很久以前的事了-这与我无关,我也不记得问题出在哪里了。请阅读available()的文档,尽管有可用的数据,但实现始终返回0是完全合法的。这就是我在这里提问的原因。也许有人知道如何等到数据可用后再处理下一个代码吗?指定“不工作”的含义将大大有助于回答这个问题。你发现实际发生的事情和你需要发生的事情之间有什么区别?没关系,那是很久以前的事了-这与我无关,我也不记得问题出在哪里了。请阅读available()的文档,尽管有可用的数据,但实现始终返回0是完全合法的。这就是我在这里提问的原因。也许有人知道如何等到数据可用后再处理下一个代码吗?指定“不工作”的含义将大大有助于回答这个问题。你发现实际发生的事情和你需要发生的事情之间有什么区别?没关系,那是很久以前的事了-这与我无关,我也不记得问题出在哪里了。请阅读available()的文档,尽管有可用的数据,但实现始终返回0是完全合法的。这就是我在这里提问的原因。也许有人知道如何等到数据可用后再处理下一个代码吗?指定“不工作”的含义将大大有助于回答这个问题。你发现实际发生的事情和你需要发生的事情之间有什么区别?没关系,那是很久以前的事了——这与我无关,我也不记得问题出在哪里了。