【问题标题】:Android TCP client安卓 TCP 客户端
【发布时间】:2011-05-02 21:04:39
【问题描述】:

我目前正在开发 Android 中的 tcp 客户端。 我想将我的 android 设备连接到计算机上的 tcp 服务器并每 2 秒接收一次数据。问题是由于我在 tcp 客户端中实现的 while 循环,我正在强制关闭我的应用程序。 我尝试以不同的方式编写循环,使 tcp 客户端检查服务器套接字,但没有成功。如何在不强制关闭的情况下创建一个检查服务器套接字的循环?

这是我目前正在使用的代码:

    public class Connection implements Runnable {
    @Override
    public void run() {         
        try {                    
            sk=new Socket(server,port);
            viewsurface.setText("connected");       
            flag = true;
        } catch (UnknownHostException e) {      
            viewsurface.setText("failed 1 socket");
            flag = false;
        } catch (IOException e) {                   
            viewsurface.setText("failed 2 socket");
            flag = false;
        }

        while (flag == true){               
            try {
                checkin = sk.getInputStream();
                checkint = checkin.available();

                if (checkint > 0){
                    try {
                        BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream()));
                        received = in.readLine();
                        viewsurface.setText(received);

                    } catch (IOException e) {
                        viewsurface.setText("failed to receive");
                    }
                }

            Thread.sleep(2000);
            } catch (IOException e) {
                viewsurface.setText("checkin failed");

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
}

}

【问题讨论】:

    标签: android


    【解决方案1】:

    您需要粘贴导致强制关闭的异常,然后任何人才能提供体面的帮助。

    但是一些可能解决问题的建议。

    • 最有可能是这个问题,viewText.setText 只能从 UI 线程调用。有很多方法可以处理这个问题。您可以使用 AsyncTask,或者如果您有 Activity 引用,您可以使用 runOnUIThread 并传入一个调用 setText 的 runnable。
    • 移动签入 = sk.getInputStream();到循环之前。没有理由让每个循环都通过循环。
    • 不要在循环的每个循环中创建 BufferedReader。将其移到循环之前
    • .sleep(2000) 不能保证正好 2 秒。

    我遇到了一些代码格式问题,对此我深表歉意。

     private class DownloadFilesTask extends AsyncTask<Void, String, Void> {
         protected Long doInBackground(Void... nothing) {
             try {                    
                sk=new Socket(server,port);
            publishProgress("connected");       
                flag = true;
        } catch (UnknownHostException e) {      
            publishProgress("failed 1 socket");
            flag = false;
        } catch (IOException e) {                   
            publishProgress("failed 2 socket");
            flag = false;
        }
    
        while (flag == true){               
            try {
                checkin = sk.getInputStream();
                checkint = checkin.available();
    
                if (checkint > 0){
                    try {
                        BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream()));
                        received = in.readLine();
                        publishProgress(received);
    
                    } catch (IOException e) {
                        publishProgress("failed to receive");
                    }
                }
    
            Thread.sleep(2000);
            } catch (IOException e) {
                updateProgress(
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        return;
     }
    
     protected void onProgressUpdate(String... progress) {
        viewsurface.setText(progress[0]);
     }
    
     protected void onPostExecute(Void result) {
         //nothing
     }
    
     }
    

    【讨论】:

    • 是的,你是对的。导致强制关闭的问题确实是viewText.setText。如果我注释掉那条线,我将不再有任何力量关闭。我还在循环之前移动了 checkin 和 bufferreader。
    • 那么,现在的问题是,每次我收到一些东西并在主 UI 线程中更新/显示它时,如何传递“received”变量的值?很抱歉这个问题,但我是 android/java 的新手。
    • 添加了一些使用 AsyncTask 的示例代码。这应该做你想做的。
    • 同时,我设法通过使用您建议的 runOnUIThread 解决了它。非常感谢您的支持!
    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多