2

我正在尝试制作一个将一些数据包发送到嵌入式设备的 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();
}

先感谢您!!!

4

1 回答 1

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 线程教程] ,了解属于您的服务器的协议很重要。祝你好运,有一个不错的套接字程序:)。

于 2013-10-01T18:39:30.670 回答