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搜索,像样的数目,但所有我能找到的人乱放的权限线在清单
尝试继续而不调用'.connect()'。这些文档在这方面有点混乱,因为它告诉你返回的'URLConnection'在创建时没有连接,但'HttpURLConnection'样本从不显示对'.connect()'的实际调用。这可能是因为你已经连接,并且随后调用'.connect()'试图在已经完成连接时尝试建立连接,导致幕后出现奇怪的权限问题。 –
当然有网络本身的权限?这是一个套接字创建错误,至今与Internet没有任何关系。 – EJP
我很难相信这一点。为什么会在创建底层套接字FD之前调用setSoTimeout()?和/或为什么它会创建另一个套接字FD?它似乎是Android中的一个bug:无论是'Socket.setSoTImeout()'还是'HttpURLConnection.connect()'都做了一件很奇怪的事情。 – EJP