2016-09-09 65 views
0

我得到的错误信息发送到服务器,java.net.SocketException异常:socket失败:EACCES(拒绝)

java.net.SocketException异常:socket失败:EACCES(拒绝)

这是我的方法来发布数据到服务器

public void postData(String stuff){ 
    //Create a new HTTPClient and Post Header 
    URL url; 
    HttpURLConnection con = null; 
    status.setText("In post"); 
    try{ 
     url = new URL("http://myaddress/gpsin"); 
     con = (HttpURLConnection)url.openConnection(); 
     con.setDoOutput(true); 
     con.setRequestMethod("POST"); 
     con.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); 
     con.connect(); 

     //Send Request 
     DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
     wr.writeBytes((stuff)); 
     wr.flush(); 
     wr.close(); 

     InputStream is; 
     int response = con.getResponseCode(); 
     if(response >= 200 && response<= 399){ 
      //return success 
      status.setText("Success!"); 
     }else{ 
      //return fail 
      status.setText("Fail"); 
     } 
    } catch (Exception e){ 
     e.printStackTrace(); 
     status.setText("In catch"); 
    }finally{ 
     if(con!=null)con.disconnect(); 
    } 
} 

清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jake.locationapp"> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

的logcat:

09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err: java.net.SocketException: socket failed: EACCES (Permission denied) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at libcore.io.IoBridge.socket(IoBridge.java:623) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at java.net.Socket.checkOpenAndCreate(Socket.java:689) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at java.net.Socket.setSoTimeout(Socket.java:543) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.okhttp.Connection.connect(Connection.java:158) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.okhttp.Connection.connect(Connection.java:174) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:316) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:249) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:397) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.jake.locationapp.MainActivity.postData(MainActivity.java:84) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.jake.locationapp.MainActivity$MyLocationListener.onLocationChanged(MainActivity.java:197) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:285) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:214) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:230) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at android.os.Looper.loop(Looper.java:135) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5430) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at java.lang.reflect.Method.invoke(Method.java:372) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err: Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at libcore.io.Posix.socket(Native Method) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err:  at libcore.io.IoBridge.socket(IoBridge.java:608) 
09-09 12:43:33.308 11819-11819/com.jake.locationapp W/System.err: ... 21 more 

我已经做了google搜索,像样的数目,但所有我能找到的人乱放的权限线在清单

+0

尝试继续而不调用'.connect()'。这些文档在这方面有点混乱,因为它告诉你返回的'URLConnection'在创建时没有连接,但'HttpURLConnection'样本从不显示对'.connect()'的实际调用。这可能是因为你已经连接,并且随后调用'.connect()'试图在已经完成连接时尝试建立连接,导致幕后出现奇怪的权限问题。 –

+0

当然有网络本身的权限?这是一个套接字创建错误,至今与Internet没有任何关系。 – EJP

+0

我很难相信这一点。为什么会在创建底层套接字FD之前调用setSoTimeout()?和/或为什么它会创建另一个套接字FD?它似乎是Android中的一个bug:无论是'Socket.setSoTImeout()'还是'HttpURLConnection.connect()'都做了一件很奇怪的事情。 – EJP

回答

0

尝试程序,但不调用.connect()。这些文档在这方面有点混乱,因为它告诉你返回的URLConnection在创建时没有连接,但HttpURLConnection样本从不显示实际的.connect()调用。这可能是因为你已经连接,并且随后对.connect()的调用正试图在已经完成连接时建立连接,导致幕后出现奇怪的权限问题。 - 拉里希弗

这工作!

相关问题