我正在尝试制作一个能够将一些数据包发送到嵌入式设备的Android应用。 由于我的嵌入式设备不支持UDP数据报协议,我想使用同步TCP模拟它。
话虽如此,不需要来自设备的响应字符串,所以我想在从我的应用程序发送数据后立即断开TCP套接字。
如果有人能够概述如何在一段时间内没有收到任何数据的情况下制作一个可以执行连接并关闭套接字的线程,我将不胜感激。
我目前的代码很简单:
try {
Socket s = new Socket("localhost",12345);
//outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
PrintWriter output = new PrintWriter(out);
output.println("Hello Android!");
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
//read line(s)
String st = input.readLine();
. . .
//Close connection
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
提前谢谢!!!
答案 0 :(得分:3)
首先要注意协议,如果你的应用程序停留在String st = input.readLine();
,那么这并不意味着服务器不会发送数据,因为readLine()
方法需要一行(以CRLF结尾),这可能是服务器只发送一些没有换行的字符串,然后缓冲读取器仍然卡在线程(当前线程),因为它期望CRLF。
接下来你将有另一个接受Socket作为参数的类,然后等待,然后关闭套接字,因为服务器没有响应。这样的事情
class SocketMgr implements Runnable{
final private int timeout=5000;
private Socket s;
public SocketMgr(Socket s){this.s=s;new Thread(this).start();}
public void run(){
try{Thread.sleep(timeout);s.close();}catch(Exception ex){}
}
}
并在您的代码中
try {
Socket s = new Socket("localhost",12345);
//outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
PrintWriter output = new PrintWriter(out);
output.println("Hello Android!");
output.flush();
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
//////////////////////////////////
new SocketMgr(s);
//////////////////////////////////
//read line(s)
String st = input.readLine();
. . .
//Close connection
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
你也可以查看这个简单的[java threading tutorial] 再一次,了解属于您的服务器的协议非常重要。 祝你好运,有一个很好的套接字程序:)。