2012-11-15 116 views
0

我想..我的服务器,除了Android客户端工作正常不工作,甚至加入因特网连接许可Android的Socket连接失败

这里后建立的Android客户端和C#服务器之间的连接是代码:

private void connectSocket(String a){ 

    try { 
     InetAddress serverAddr = InetAddress.getByName("192.168.0.2"); 
     Log.d("TCP", "C: Connecting...."); 

     Socket socket = new Socket(serverAddr,4444); 
     Log.d("TCP", "C: I dunno ..."); 
     //String message = "1"; 

     PrintWriter out = null; 
     BufferedReader in = null; 

     try { 
      // Log.d("TCP", "C: Sending: '" + message + "'"); 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));     

      //out.println(message); 
      while ((in.readLine()) != null) { 
      txt.append(in.readLine()); 
      } 

      Log.d("TCP", "C: Sent."); 
      Log.d("TCP", "C: Done.");    

     } catch(Exception e) { 
      Log.e("TCP", "S: Error", e); 
     } finally { 
      socket.close(); 
     } 

    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     Log.e("TCP", "C: UnknownHostException", e); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Log.e("TCP", "C: IOException", e); 
     e.printStackTrace(); 
    }  
} 

这里是调试日志:

11-15 02:41:58.040: W/dalvikvm(26839): threadid=1: thread exiting with uncaught exception (group=0x41c352a0) 
11-15 02:41:58.075: E/AndroidRuntime(26839): FATAL EXCEPTION: main 
11-15 02:41:58.075: E/AndroidRuntime(26839): android.os.NetworkOnMainThreadException 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at libcore.io.IoBridge.connect(IoBridge.java:112) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at java.net.Socket.startupSocket(Socket.java:566) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at java.net.Socket.<init>(Socket.java:225) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at com.example.socketclient.SocketCode.connectSocket(SocketCode.java:50) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at com.example.socketclient.SocketCode.access$0(SocketCode.java:44) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at com.example.socketclient.SocketCode$1.onClick(SocketCode.java:35) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.view.View.performClick(View.java:4211) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.view.View$PerformClick.run(View.java:17267) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.os.Handler.handleCallback(Handler.java:615) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.os.Looper.loop(Looper.java:137) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at android.app.ActivityThread.main(ActivityThread.java:4898) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at java.lang.reflect.Method.invokeNative(Native Method) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at java.lang.reflect.Method.invoke(Method.java:511) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
11-15 02:41:58.075: E/AndroidRuntime(26839): at dalvik.system.NativeStart.main(Native Method) 

回答

7

通过它的外观你试图在主线程上执行联网操作。看看日志跟踪专线android.os.NetworkOnMainThreadException

Android Developer: Network on Main Thread Exception

永远做比主以外的单独的线程联网。还有不同的方法来完成这一点,例如您可以使用​​或自行启动线程。

对于这个和Android开发人员站点,SO上有几个帖子。这里有一些链接,让你去:

Android Developer: Connecting to the network

Android Developers Blog: Multithreading for performance

+0

非常感谢,它的工作 –

0

检查此链接here,这是因为,由于API的最新版本,禁止执行主线程调用的网络操作,因此您需要创建另一个(后台)线程来执行它。