Java 使套接字连接在发送命令后等待响应
在android应用程序中,我使用android服务创建套接字连接。这个想法是,当活动开始时,我正在连接到服务器,并且我将套接字连接保持打开状态,以便在应用程序的其他部分进行访问 现在我要做的是使用缓冲写入器向服务器写入命令。在写入之后,我要执行检查是否已经收到响应。我正在尝试使用Java 使套接字连接在发送命令后等待响应,java,android,sockets,Java,Android,Sockets,在android应用程序中,我使用android服务创建套接字连接。这个想法是,当活动开始时,我正在连接到服务器,并且我将套接字连接保持打开状态,以便在应用程序的其他部分进行访问 现在我要做的是使用缓冲写入器向服务器写入命令。在写入之后,我要执行检查是否已经收到响应。我正在尝试使用while(inStream.available()==0)循环来实现这一点。然而,这是行不通的。如何让应用程序等待特定命令的响应,直到处理进一步的代码 连接到插座: public class connectS
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是完全合法的。这就是我在这里提问的原因。也许有人知道如何等到数据可用后再处理下一个代码吗?指定“不工作”的含义将大大有助于回答这个问题。你发现实际发生的事情和你需要发生的事情之间有什么区别?没关系,那是很久以前的事了——这与我无关,我也不记得问题出在哪里了。