简体   繁体   English

Android 4.0.3上的TCP套接字

[英]TCP socket on Android 4.0.3

I am working on a project in which I have a TCP connection with a server via Android. 我正在一个项目中,我通过Android与服务器建立TCP连接。
I am using the following code: 我正在使用以下代码:

public class MyService extends Service {
private static final String TAG = "MyService";
MediaPlayer player;
Socket s;
@Override
public IBinder onBind(Intent intent) {
    return null;
}

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

    player = MediaPlayer.create(this, R.raw.braincandy);
    player.setLooping(false); // Set looping
}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");
    player.stop();
    try {
        s.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");
    player.start();
    try {
        s = new Socket("192.168.1.54", 64000);
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 }

I am running the connection as a service. 我正在将连接作为服务运行。

The real problem is I can make a connection with my Android phone (2.3.7) and with the emulator (2.3.3) but when I want to test in on my tablet (4.0.3), my app always crashes when I want to start the connection. 真正的问题是我可以与Android手机(2.3.7)和仿真器(2.3.3)建立连接,但是当我要在平板电脑(4.0.3)上进行测试时,我的应用程序总是在崩溃时崩溃开始连接。

Can someone help me with this? 有人可以帮我弄这个吗?

Here is the logcat log: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start service 这是logcat日志:FATAL EXCEPTION:main java.lang.RuntimeException:无法启动服务

com.gunther.servicetcp.MyService@412b0a98 with Intent 
{    cmp=com.gunther.servicetcp/.MyService }: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2376)
at android.app.ActivityThread.access$1900(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.NetworkOnMainThreadException
0at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.Socket.startupSocket(Socket.java:566)
at java.net.Socket.tryAllAddresses(Socket.java:127)
at java.net.Socket.<init>(Socket.java:177)
at java.net.Socket.<init>(Socket.java:149)
at com.gunther.servicetcp.MyService.onStart(MyService.java:53)
at android.app.Service.onStartCommand(Service.java:438)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2359)
:   ... 10 more

You shouldn't do network operations on the main thread. 您不应该在主线程上执行网络操作。 This will lead to your app being unresponsive. 这将导致您的应用无响应。 Before Honeycomb you could get away with it, but Honeycomb and newer Android versions will check and throw the exception you're getting. 在Honeycomb之前,您可以摆脱它,但是Honeycomb和较新的Android版本将检查并抛出您得到的异常。 See also this page of the Android Developers API 另请参阅Android Developers API的此页面

ServicesonStart()方法在主线程上运行(是的,服务似乎在应用程序的主线程上运行。)因此,您应该在onStart()方法中派生另一个线程,并在其中执行所需的所有操作线。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM