Android TCP客户端

cdr*_*rag 3 android

我目前正在开发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();
            }

        }
}
Run Code Online (Sandbox Code Playgroud)

}

Mik*_* dg 5

在任何人提供合适的帮助之前,你需要粘贴你所获得的异常以使力量关闭.

但有些建议可能会解决问题.

  • 最有可能是问题,viewText.setText只能从UI线程调用.有很多方法可以解决这个问题.您可以使用AsyncTask,或者如果您有一个Activity引用,则可以使用runOnUIThread并传入一个调用setText的runnable.
  • 移动checkin = sk.getInputStream(); 在循环之前.没有理由在循环中的每个循环中获得strem.
  • 不要在循环中的每个循环中创建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
 }

 }
Run Code Online (Sandbox Code Playgroud)