【问题标题】:android send and receive TCP Packageandroid发送和接收TCP包
【发布时间】:2013-12-27 19:29:46
【问题描述】:

我刚收到一个简短的问题。 我正在尝试制作一个可以通过发送 TCP 包与服务器通信的应用程序,然后服务器将 TCP 包发送回或发送到其他设备。 但是我怎样才能让服务在设备上收到 TCP 包时发出通知?

我试过这个;

 extends Service {
Thread henk;

private static final String TAG = "Service";

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");
    henk = new Thread(new Runnable(){

        public void run() {
            // TODO Auto-generated method stub
            try {
                Boolean end = false;
                ServerSocket ss = new ServerSocket(1337);
                while(!end){
                        //Server is waiting for client here, if needed
                        Socket s = ss.accept();
                        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));

                        String st = input.readLine();
                        Log.d("Tcp Example", "From client: "+st);

                        s.close();

                }
        ss.close();


        } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
        }



    });


}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");

}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");

    henk.run();

}

但这只会让我的应用程序崩溃。 请帮忙?

堆栈跟踪:

    E/ActivityManager(  240): ANR in tictactoe.elqauto
E/ActivityManager(  240): Reason: Executing service tictactoe.elqauto/.servicere
cieve
E/ActivityManager(  240): Load: 7.09 / 7.29 / 7.5
E/ActivityManager(  240): CPU usage from 9411ms to 3791ms ago:
E/ActivityManager(  240):   1.2% 3857/de.devmil.minimaltext: 1.1% user + 0.1% ke
rnel / faults: 191 minor
E/ActivityManager(  240):   2.5% 240/system_server: 1.9% user + 0.5% kernel / fa
ults: 20 minor
E/ActivityManager(  240):   0.1% 4797/tiwlan_wq: 0% user + 0.1% kernel
E/ActivityManager(  240):   0% 16322/org.adwfreak.launcher: 0% user + 0% kernel
/ faults: 226 minor 1 major
E/ActivityManager(  240):   0% 19108/com.aricent.mtp: 0% user + 0% kernel / faul
ts: 16 minor
E/ActivityManager(  240):   0% 30600/com.google.process.gapps: 0% user + 0% kern
el / faults: 20 minor 5 major
E/ActivityManager(  240): 11% TOTAL: 8% user + 3% kernel + 0.1% iowait
E/ActivityManager(  240): CPU usage from 368ms to 884ms later:
E/ActivityManager(  240):   5.6% 240/system_server: 1.8% user + 3.7% kernel / fa
ults: 15 minor
E/ActivityManager(  240):     5.6% 266/ActivityManager: 1.8% user + 3.7% kernel
E/ActivityManager(  240): 44% TOTAL: 1.9% user + 1.9% kernel + 40% iowait

总结:

所以我要做的是向服务器发送一个带有名称的 TCP 包,服务器将从数据库中获取属于该名称的 IP,并向它发送一个带有一些信息的 TCP 包。由于我没有找到解决方案,我尝试了套接字,但现在我被困在接收部分。

【问题讨论】:

  • 你用过logcat吗?如果可以,请在您的应用程序崩溃时从 logcat 发布堆栈跟踪:adb logcat -s *:E 应该在命令行中执行此操作。我的猜测是尝试从不是 UI 线程更新 UI,但崩溃输出肯定会说明。
  • @jarvisteve 将堆栈跟踪写入 '/data/anr/traces.txt' 但我找不到那个文件?

标签: java android sockets package


【解决方案1】:

在 android 设备上运行 TCP 服务器没有多大意义,因为您通常不知道它的地址。

另一种解决方案是保持与服务器的客户端连接处于活动状态,然后将包推送回应该接收包的任何设备。

更省电的解决方案是使用 Google 的 C2DM。但是,这确实需要使用 Google 帐户登录设备。

【讨论】:

  • 好吧,当我更改为数据库时,我会发送我的 IP,服务器会使用 IP 获取我想要发送到的名称,并将包发送到该设备,但它需要重新接收 C2DM 甚至可以做那个?
  • 收件人离线怎么办?是转账失败还是包裹最终会在收件人上线时到达? C2DM 旨在解决最后一种情况,但如果延迟是一个问题,也可以用于实现第一种情况。您必须更详细地描述您的通信场景,以便我对此发表更多评论。
  • 当他重新上线时,他会收到它,这也是我也在尝试的。等我编辑一下
  • C2DM 是 iphone 推送通知的 android 答案。您将很难自己实现这一点,而且很可能还会消耗更多的电池电量。 link 解释得更详细。
  • 无论如何。除了您自己的网络之外,您无法在任何设备上的任何设备上保持可访问的欢迎套接字,例如端口 1337。如果不使用 C2DM,我认为您将不得不进行定期轮询或保持客户端连接活动以进行长轮询。
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 2014-09-18
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2017-10-24
相关资源
最近更新 更多