2013-09-05 45 views
0

我一直在编写两个Android应用程序,一个是服务器,另一个是客户端。应用程序无法通过设备套接字互相连接,每次客户端尝试连接到服务器时以及服务器尝试创建自己的套接字时,我都会在LogCat中拒绝访问。添加权限后应用程序崩溃?

经过对这个问题的研究后,我得出了这样的结论:在我的android清单文件中包含INTERNET权限将允许两个应用程序彼此连接。但是,在添加此权限时,我的应用程序现在都会加载。他们之前都运行良好(除了没有互相连接),所以我不知道发生了什么。我张贴了两个应用程序的代码和清单文件,如果您认为需要,我也可以发布LogCat。

提前欢呼。

代码服务器:

package com.example.simplerclienttest; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 


    Double lat=50.0, lng= 50.0, speed=(Math.random()*20), heading= 0.010011011, latB4, lngB4; 
    int time = 1; 
    int trackId; 


    public void go(){ 

     try{ 
      ServerSocket serverSock = new ServerSocket(20000); 

      while(true){ 

       Socket sock = serverSock.accept(); 

       PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
       String header = getHeader(); 
       writer.write(header); 
       writer.flush(); 
       writer.close(); 

      } 

     }catch (IOException ex){ 
      ex.printStackTrace(); 
     } 

    } 

    public String getHeader(){ 
     latB4= lat; 
     lngB4= lng; 
     lat = lat + ((Math.random()-0.5)/100); 
     lng = lng + ((Math.random()-0.5)/100); 
     String Heading = "CBS"; 
     time = time + 1; 
     trackId = 1; 
     int depth = 0; 
     speed = speed + ((Math.random()-0.5)*2); 
     if((lat - latB4)>0 && (lng-lngB4)>0){ 
      heading = (((Math.atan(Math.abs(lng)/Math.abs(lat)))*180)/Math.PI); 
     }else{ 
      if((lat - latB4)<0 && (lng-lngB4)>0){ 
       heading= (90 + (((Math.atan(Math.abs(lat)/Math.abs(lng)))*180)/Math.PI)); 
      }else{ 
       if((lat - latB4)<0 && (lng-lngB4)<0){ 
        heading= (180 + (((Math.atan(Math.abs(lng)/Math.abs(lat)))*180)/Math.PI)); 
       }else{ 
        if((lat - latB4)>0 && (lng-lngB4)<0){ 
         heading= (270 + (((Math.atan(Math.abs(lat)/Math.abs(lng)))*180)/Math.PI)); 
        }else{ 
         if((lat - latB4)==0 && (lng-lngB4)<0){ 
          heading= 270.0; 
         }else{ 
          if((lat - latB4)==0 && (lng-lngB4)>0){ 
           heading = 90.0; 
          }else{ 
           if((lat - latB4)>0 && (lng-lngB4)==0){ 
            heading= 0.0; 
           }else{ 
            if((lat - latB4)<0 && (lng-lngB4)==0){ 
             heading = 180.0; 
         }else{}}}}}}}} 


     return(Heading+","+time+","+trackId+","+lat+","+lng+","+depth+","+speed+","+heading); 
    } 

    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     go(); 


    } 

    } 

舱单服务器:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.simplerclienttest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.simplerclienttest.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

代码客户端:

package com.example.clienttest; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.util.concurrent.TimeUnit; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.Menu; 
import android.widget.TextView; 

public class ClientTestMain extends Activity { 

final Handler myHandler = new Handler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_client_test_main); 


    Timer myTimer = new Timer(); 
    myTimer.schedule(new TimerTask(){ 
     @Override 
     public void run(){ 
      UpdateGUI();}},0,1000); 
     } 


final Runnable myRunnable = new Runnable(){ 
      @Override 
      public void run(){ 

       TextView Header = (TextView) findViewById(R.id.textView1); 
       TextView Time = (TextView) findViewById(R.id.textView7); 
       TextView TrackId = (TextView) findViewById(R.id.textView2); 
       TextView Latitude = (TextView) findViewById(R.id.textView3); 
       TextView Longitude = (TextView) findViewById(R.id.textView4); 
       TextView Depth = (TextView) findViewById(R.id.textView5); 
       TextView Speed = (TextView) findViewById(R.id.textView6); 
       TextView Bearing = (TextView) findViewById(R.id.textView8); 

       try{ 
        while(true){ 
        Socket infoSocket = new Socket("127.0.0.1", 20000); 
        InputStreamReader stream = new InputStreamReader(infoSocket.getInputStream()); 
        BufferedReader reader = new BufferedReader(stream); 
        String message = reader.readLine(); 
        String[] op = message.split(","); 
        Header.setText(op[0]); 
        Time.setText(op[1]); 
        TrackId.setText(op[2]); 
        Latitude.setText(op[3]); 
        Longitude.setText(op[4]); 
        Depth.setText(op[5]); 
        Speed.setText(op[6]); 
        Bearing.setText(op[7]); 
        TimeUnit.SECONDS.sleep(1); 
        } 
       }catch(IOException ex){ 
        ex.printStackTrace(); 
       }catch (InterruptedException e) { 
       } 

      }}; 



    private void UpdateGUI(){ 
     myHandler.post(myRunnable); 
    } 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.client_test_main, menu); 
    return true; 
} 

} 

清单客户端:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.clienttest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.clienttest.ClientTestMain" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

如果看到LogCat会帮助请你能留下一条消息,并添加它:)谢谢。

这是客户端与INTERNET权限崩溃的logcat的:

09-05 14:12:59.500: D/AndroidRuntime(16366): Shutting down VM 
09-05 14:12:59.500: W/dalvikvm(16366): threadid=1: thread exiting with uncaught exception (group=0x40bea1f8) 
09-05 14:12:59.500: E/AndroidRuntime(16366): FATAL EXCEPTION: main 
09-05 14:12:59.500: E/AndroidRuntime(16366): android.os.NetworkOnMainThreadException 
09-05 14:12:59.500: E/AndroidRuntime(16366): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at libcore.io.IoBridge.connect(IoBridge.java:112) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.net.Socket.startupSocket(Socket.java:566) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.net.Socket.tryAllAddresses(Socket.java:127) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.net.Socket.<init>(Socket.java:177) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.net.Socket.<init>(Socket.java:149) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at com.example.clienttest.ClientTestMain$1.run(ClientTestMain.java:50) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at android.os.Handler.handleCallback(Handler.java:605) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at android.os.Looper.loop(Looper.java:137) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at android.app.ActivityThread.main(ActivityThread.java:4514) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.lang.reflect.Method.invokeNative(Native Method) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at java.lang.reflect.Method.invoke(Method.java:511) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
09-05 14:12:59.500: E/AndroidRuntime(16366): at dalvik.system.NativeStart.main(Native Method) 

这是logcat的客户端不上网权限:

09-05 14:15:29.062: W/System.err(16707): java.net.SocketException: socket failed: EACCES (Permission denied) 
09-05 14:15:29.062: W/System.err(16707): at libcore.io.IoBridge.socket(IoBridge.java:573) 
09-05 14:15:29.062: W/System.err(16707): at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201) 
09-05 14:15:29.062: W/System.err(16707): at java.net.Socket.startupSocket(Socket.java:559) 
09-05 14:15:29.062: W/System.err(16707): at java.net.Socket.tryAllAddresses(Socket.java:127) 
09-05 14:15:29.062: W/System.err(16707): at java.net.Socket.<init>(Socket.java:177) 
09-05 14:15:29.062: W/System.err(16707): at java.net.Socket.<init>(Socket.java:149) 
09-05 14:15:29.062: W/System.err(16707): at com.example.clienttest.ClientTestMain$1.run(ClientTestMain.java:50) 
09-05 14:15:29.062: W/System.err(16707): at android.os.Handler.handleCallback(Handler.java:605) 
09-05 14:15:29.062: W/System.err(16707): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-05 14:15:29.062: W/System.err(16707): at android.os.Looper.loop(Looper.java:137) 
09-05 14:15:29.062: W/System.err(16707): at android.app.ActivityThread.main(ActivityThread.java:4514) 
09-05 14:15:29.062: W/System.err(16707): at java.lang.reflect.Method.invokeNative(Native Method) 
09-05 14:15:29.062: W/System.err(16707): at java.lang.reflect.Method.invoke(Method.java:511) 
09-05 14:15:29.070: W/System.err(16707): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
09-05 14:15:29.070: W/System.err(16707): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
09-05 14:15:29.070: W/System.err(16707): at dalvik.system.NativeStart.main(Native Method) 
09-05 14:15:29.070: W/System.err(16707): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied) 
09-05 14:15:29.070: W/System.err(16707): at libcore.io.Posix.socket(Native Method) 
09-05 14:15:29.070: W/System.err(16707): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181) 
09-05 14:15:29.070: W/System.err(16707): at libcore.io.IoBridge.socket(IoBridge.java:558) 
09-05 14:15:29.070: W/System.err(16707): ... 15 more 
+0

请添加日志,其主要部分在您的文章 –

+0

其不会导致崩溃,但由于您添加了权限 –

+0

而导致新的代码块“如果您认为需要我也可以发布LogCat”。在崩溃之后,Logcat总是很有帮助,除了最相关的代码之外,最重要的部分也是 – codeMagic

回答

0

这是严格的问题在Android 4.0中引入的模式。在主线程上对后台线程所做的网络工作进行编码。在主线程上工作在活动中定义严格模式权限。

+0

请解释一下。 – tbodt

相关问题