Android TCP客户端/服务器崩溃

时间:2012-07-13 23:22:43

标签: android tcp crash

您好我是TCP的新手,我想建立一个多人游戏。但是每次打开'Client.java'类时,我都会遇到致命错误,导致我的应用程序崩溃。

我得到了android.os.NetworkOnMainThreadException,我在android manufest中添加了INTERNET权限。我使用Intent从另一个进入这个类,是的,我有setOnClickListener(this);在那里,并添加活动到manufest所以它不会因此而崩溃。 如果这是一个好主意,我在应用程序中构建TCP服务器和客户端,那么我将如何使其成为公共主机?就像我需要为主机付费然后在服务器和客户端使用ip / port一样?

无论如何这里是代码:

package com.theory.game;
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class Client extends Activity { 
/** Called when the activity is first created. */ 
Scanner scanner = new Scanner(System.in); 
//StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.client); 
    //StrictMode.setThreadPolicy(policy);  
    final EditText msg = (EditText) findViewById(R.id.etMsg); 
    Button send = (Button) findViewById(R.id.bSend); 
    final TextView convo = (TextView) findViewById(R.id.tvConvo); 
    final TextView status = (TextView) findViewById(R.id.tvStatus); 

    try { 
        send.setOnClickListener(new View.OnClickListener() { 

            Socket s = new Socket("10.0.2.2", 8080); 
            String message = msg.getText().toString(); 

            @Override 
            public void onClick(View v) { 
                status.setText("..."); 
                PrintWriter outp = null; 
                BufferedReader inp = null; 
                status.setText("Established connection.."); 
                String serverMsg = null; 

                try { 
                    outp = new PrintWriter(s.getOutputStream(), true); 
                    inp = new BufferedReader(new InputStreamReader(s.getInputStream())); 
                    serverMsg = inp.readLine(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
                convo.append(serverMsg + "\n"); 

                if (message != null) { 
                    if (msg.getText().toString().trim() == "QUIT") { 
                        try { 
                            s.close(); 
                        } catch (IOException e) { 
                            e.printStackTrace(); 
                        } 
                        status.setText("Disconnected from server."); 

                    } else { 
                            try { 

                                convo.append(message + "\n"); 
                                outp.println(message);  
                                serverMsg = inp.readLine(); 
                                convo.append(serverMsg + "\n"); 
                            } catch (IOException e) { 
                                e.printStackTrace(); 
                            } 
                    } 

                } 
                else 
                    status.setText("Problem in connection..!"); 
            } 
        }); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
} 
}


`FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity 
android.os.NetworkOnMainThreadException
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
E/AndroidRuntime(706):  at android.app.ActivityThread.handleLaunchActivity
E/AndroidRuntime(706):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime(706):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-13 22:53:18.542: E/AndroidRuntime(706):  at android.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime(706):  at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(706):  at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(706):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(706):  at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(706):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)

E/AndroidRuntime(706):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(706):  at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(706): Caused by: android.os.NetworkOnMainThreadException
E/AndroidRuntime(706):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)

E/AndroidRuntime(706):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
E/AndroidRuntime(706):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
E/AndroidRuntime(706):  at libcore.io.IoBridge.connect(IoBridge.java:112)
E/AndroidRuntime(706):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
E/AndroidRuntime(706):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
E/AndroidRuntime(706):  at java.net.Socket.startupSocket(Socket.java:566)
E/AndroidRuntime(706):  at java.net.Socket.tryAllAddresses(Socket.java:127)
E/AndroidRuntime(706):  at java.net.Socket.<init>(Socket.java:177)
E/AndroidRuntime(706):  at java.net.Socket.<init>(Socket.java:149)
E/AndroidRuntime(706):  at com.theory.game.Client$1.<init>(Client.java:35)
E/AndroidRuntime(706):  at com.theory.game.Client.onCreate(Client.java:33)
E/AndroidRuntime(706):  at android.app.Activity.performCreate(Activity.java:4465)
E/AndroidRuntime(706):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)

E/AndroidRuntime(706):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

E/AndroidRuntime(706):  ... 11 more `

1 个答案:

答案 0 :(得分:0)

您是否定位SDK 11或更高版本且具有严格模式?每当您尝试在主线程上执行网络操作时,都会抛出NetworkOnMainThreadException。将您的网络代码移动到AsyncTask。您不仅可以处理例外情况,还可以改善您的申请。

使用AsyncTask非常简单,并且有很多很好的教程。 Android documentationLars Vogel的教程。