【问题标题】:Using TCP + AsyncTask To Keep Connection Open and Listening for Data Being Sent From Server使用 TCP + AsyncTask 保持连接打开并监听服务器发送的数据
【发布时间】:2012-12-12 07:02:46
【问题描述】:

您好 Stackoverflow 成员!这是我的问题... 1) 连接到 TCP 服务器 *CHECK 2) 发送初始数据包并从服务器接收 (VB.NET) *CHECK

现在我的问题

我正在尝试保持连接有效,并继续侦听传入数据。我尝试使用计时器,但没有运气。任何帮助将不胜感激

  package com.WheresmySon;


  import java.io.BufferedReader;
  import java.io.BufferedWriter;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.OutputStreamWriter;
  import java.net.Socket;
  import java.net.UnknownHostException;
  import android.app.Activity;
  import android.content.Intent;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.View.OnClickListener;
  import android.widget.TextView;
  import java.util.Timer;
  import java.util.TimerTask;


  public class TcpClient extends Activity {
private static BufferedReader in;
private static BufferedWriter out;
private static Socket s;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new TcpClientTask().execute();

}


class TcpClientTask extends AsyncTask<Void, Void, Void> {
    private static final int TCP_SERVER_PORT = 1234;
    private boolean error = false;
    Boolean SocketStarted = false;

    protected Void doInBackground(Void... arg0) {
        try {
            s = new Socket("10.0.2.2", TCP_SERVER_PORT);


                in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

            //send output msg
            String outMsg = "VER:Android,LAT:28.111921,LNG:-81.950433,ID:1038263,SND:0,VDO:0,TXT:Testing";
            out.write(outMsg);
            out.flush();

            Log.i("TcpClient", "sent: " + outMsg);

            //accept server response

            String inMsg = in.readLine();

            Log.i("TcpClient", "received: " + inMsg);



            //close connection
        } catch (UnknownHostException e) {
            error = true;
            e.printStackTrace();
        } catch (IOException e) {
            error = true;
            e.printStackTrace();
        } 

        return null;
    }

    protected void onPostExecute() {
        if(error) {
            // Something bad happened

        }
        else {
            // Success

    }
}

}

//replace runTcpClient() at onCreate with this method if you want to run tcp client as a service
private void runTcpClientAsService() {
    Intent lIntent = new Intent(this.getApplicationContext(), TcpClientService.class);
    this.startService(lIntent);
}

  }

TcpClientService.java

 package com.WheresmySon;

 import java.io.BufferedReader;
 import java.io.BufferedWriter;
      import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.net.Socket;
 import java.net.UnknownHostException;

 import android.app.Service;
 import android.content.Intent;
      import android.os.IBinder;
 import android.util.Log;

 public class TcpClientService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    return null;
}
@Override
public void onCreate() {
    runTcpClient();
    this.stopSelf();
}
private static final int TCP_SERVER_PORT = 1234;
private void runTcpClient() {
    try {
        Socket s = new Socket("10.0.2.2", TCP_SERVER_PORT);
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //send output msg
        String outMsg = "TCP connecting to " + TCP_SERVER_PORT + System.getProperty("line.separator"); 
        out.write(outMsg);
        out.flush();
        Log.i("TcpClient", "sent: " + outMsg);
        //accept server response
        String inMsg = in.readLine() + System.getProperty("line.separator");
        Log.i("TcpClient", "received: " + inMsg);
        //close connection
        s.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
     }
 }

【问题讨论】:

    标签: java android android-intent android-asynctask inputstreamreader


    【解决方案1】:

    AsyncTask 不是任何网络内容的最佳位置,尤其是对于像Sockets 这样的非无状态连接。最好的方法是使用Service。您可以尝试搜索有关如何在 Android 中使用服务处理套接字连接的任何代码示例。此代码将永远无法正常工作。

    【讨论】:

    • 嗨 Evos。如果你看代码的底部有一个 runTCPClientAsService() 我应该用它来代替吗?
    • 如果这是一个示例项目,并且它已经正确实现了TcpClientService,是的,最好使用它而不是AsyncTask
    • 埃沃。这是 TcpClientServer() 可以说我使用它我将如何“侦听”传入的数据并保持此连接作为服务打开?
    • @Ruben 这是一个非常大的问题,它包含很多关于编程和使用 Android 框架的信息。首先检查有关服务的文档 (developer.android.com/guide/components/services.html),如果您不精通 Android,您可以尝试以简单的方式使用它,例如 int 本教程 (thinkandroid.wordpress.com/2010/03/27/…)
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多