【问题标题】:Threaded TCP connection - Android线程 TCP 连接 - Android
【发布时间】:2013-10-03 03:17:01
【问题描述】:

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

提前谢谢你!!!

【问题讨论】:

    标签: java android


    【解决方案1】:

    首先要注意协议,如果您的应用程序卡在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] 再一次,了解属于您的服务器的协议很重要。 祝你好运,有一个不错的套接字程序:)。

    【讨论】:

    • 感谢您的见解。当我调用新的 SocketMgr(s) 时;我收到以下错误: Gradle:找不到符号构造函数 SocketMgr(java.net.Socket) 我对 OOP 比较陌生 :(
    • 啊,对不起,错字,我更新了代码,请再检查一下。
    • 再次感谢您。这可能是一个新帖子的问题。我已经在清单中定义了互联网权限,但是当我尝试打开套接字时,应用程序崩溃了。我不知道为什么,TCP连接的代码简单明了。
    • 所以请确保服务器正在侦听相关端口并接受传入连接,您会遇到什么异常?!你能分享一些代码吗?!
    • 我使用与上面相同的代码,无论是否使用线程,我都会遇到同样的问题。该应用程序只是在 android 上终止:“应用程序已停止”。在它崩溃之前我什至没有得到 UnknownHost 异常。我在虚拟和真实设备上尝试过,结果相同。
    猜你喜欢
    • 2014-01-13
    • 2013-01-07
    • 2011-05-20
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2011-10-06
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多