【问题标题】:IOException: socket failed: ACCESS (Permission denied)IOException:套接字失败:访问(权限被拒绝)
【发布时间】:2015-04-25 09:15:24
【问题描述】:

我正在尝试制作一个简单的 Android 客户端-服务器应用程序,它将向服务器发送一个字符串。

客户:

public class MainActivity extends ActionBarActivity {

EditText et;
Button btn;

private Socket client;
private PrintWriter printWriter;
private String s;

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

    et = (EditText) findViewById(R.id.et);
    btn = (Button) findViewById(R.id.btn);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            s = et.getText().toString();
            et.setText("");

            try {
                client = new Socket("192.168.1.14", 4444);
                printWriter = new PrintWriter(client.getOutputStream(), true);
                printWriter.write(s);

                printWriter.flush();
                printWriter.close();
                client.close();
            } catch (UnknownHostException ex) {
                Toast.makeText(getApplicationContext(), "UnknownHostException: " + ex.getMessage(), Toast.LENGTH_LONG).show();
            } catch (IOException ex) {
                Toast.makeText(getApplicationContext(), "IOException: " + ex.getMessage(), Toast.LENGTH_LONG).show();
            }

        }
    });
}
}

服务器:

public class Main {

private static ServerSocket serverSocket;
private static Socket socket;
private static InputStreamReader inReader;
private static BufferedReader bufferedReader;
private static String s;

public static void main(String[] args) {
    char port = 4444;

    try {
        serverSocket = new ServerSocket(port);
    } catch (IOException e) {
        System.out.println("Could not listen on port " + port);
    }

    System.out.println("Server started. Listening on port" + port);

    while (true) {
        try {
            socket = serverSocket.accept();
            inReader = new InputStreamReader(socket.getInputStream());
            bufferedReader = new BufferedReader(inReader);
            s = bufferedReader.readLine();

            System.out.println(s);
            inReader.close();
            socket.close();
        } catch (IOException e) {
            System.out.println("Problen in message reading!");
        }
    }
}

}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.eyalcherevatzki.clientserver" >

<uses-feature android:name="android.hardware.type.watch" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.DeviceDefault" >
    <activity
        android:name=".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>

LogCat:

04-25 12:27:30.386  18000-18000/com.test.eyalcherevatzki.clientserver V/Zygote﹕ Switching descriptor 45 to /dev/null
04-25 12:27:30.386  18000-18000/com.test.eyalcherevatzki.clientserver V/Zygote﹕ Switching descriptor 9 to /dev/null
04-25 12:27:30.386  18000-18000/com.test.eyalcherevatzki.clientserver D/dalvikvm﹕ Late-enabling CheckJNI
04-25 12:27:30.436  18000-18000/com.test.eyalcherevatzki.clientserver D/ActivityThread﹕ handleBindApplication:com.test.eyalcherevatzki.clientserver
04-25 12:27:30.436  18000-18000/com.test.eyalcherevatzki.clientserver D/ActivityThread﹕ setTargetHeapUtilization:0.75
04-25 12:27:30.436  18000-18000/com.test.eyalcherevatzki.clientserver D/ActivityThread﹕ setTargetHeapMinFree:2097152
04-25 12:27:30.476  18000-18000/com.test.eyalcherevatzki.clientserver I/dalvikvm﹕ DexOpt: illegal method access (call Landroid/content/res/TypedArray;.<init> (Landroid/content/res/Resources;[I[II)V from Landroid/content/res/XResources$XTypedArray;)
04-25 12:27:30.476  18000-18000/com.test.eyalcherevatzki.clientserver I/dalvikvm﹕ Could not find method android.content.res.TypedArray.<init>, referenced from method android.content.res.XResources$XTypedArray.<init>
04-25 12:27:30.476  18000-18000/com.test.eyalcherevatzki.clientserver W/dalvikvm﹕ VFY: unable to resolve direct method 82: Landroid/content/res/TypedArray;.<init> (Landroid/content/res/Resources;[I[II)V
04-25 12:27:30.476  18000-18000/com.test.eyalcherevatzki.clientserver D/dalvikvm﹕ VFY: replacing opcode 0x70 at 0x0002
04-25 12:27:30.506  18000-18000/com.test.eyalcherevatzki.clientserver I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
04-25 12:27:30.506  18000-18000/com.test.eyalcherevatzki.clientserver W/dalvikvm﹕ VFY: unable to resolve virtual method 584: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
04-25 12:27:30.506  18000-18000/com.test.eyalcherevatzki.clientserver D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
04-25 12:27:30.506  18000-18000/com.test.eyalcherevatzki.clientserver I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
04-25 12:27:30.506  18000-18000/com.test.eyalcherevatzki.clientserver W/dalvikvm﹕ VFY: unable to resolve virtual method 606: Landroid/content/res/TypedArray;.getType (I)I
04-25 12:27:30.506  18000-18000/com.test.eyalcherevatzki.clientserver D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
04-25 12:27:30.546  18000-18000/com.test.eyalcherevatzki.clientserver I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawable
04-25 12:27:30.546  18000-18000/com.test.eyalcherevatzki.clientserver W/dalvikvm﹕ VFY: unable to resolve virtual method 547: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
04-25 12:27:30.546  18000-18000/com.test.eyalcherevatzki.clientserver D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
04-25 12:27:30.546  18000-18000/com.test.eyalcherevatzki.clientserver I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawableForDensity
04-25 12:27:30.546  18000-18000/com.test.eyalcherevatzki.clientserver W/dalvikvm﹕ VFY: unable to resolve virtual method 549: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
04-25 12:27:30.546  18000-18000/com.test.eyalcherevatzki.clientserver D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
04-25 12:27:30.646  18000-18000/com.test.eyalcherevatzki.clientserver I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.2_RB1.04.04.02.065.012_msm8974_LNX.LA.3.5.2_RB1__release_AU ()
    OpenGL ES Shader Compiler Version: E031.24.00.13
    Build Date: 03/28/14 Fri
    Local Branch: mybranch2893136
    Remote Branch: quic/LNX.LA.3.5.2_RB1
    Local Patches: NONE
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.2_RB1.04.04.02.065.012 +  NOTHING
04-25 12:27:30.676  18000-18000/com.test.eyalcherevatzki.clientserver D/OpenGLRenderer﹕ Enabling debug mode 0
04-25 12:27:30.736  18000-18000/com.test.eyalcherevatzki.clientserver I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@41a99038 time:135458162
04-25 12:27:30.736  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:30.736  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:30.736  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:30.736  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:36.166  18000-18000/com.test.eyalcherevatzki.clientserver W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
04-25 12:27:39.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:39.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:39.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:39.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:41.256  18000-18000/com.test.eyalcherevatzki.clientserver W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
04-25 12:27:44.976  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:44.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:44.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:27:44.986  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:28:24.376  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:28:24.376  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:28:27.236  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:28:27.236  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:28:27.256  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-25 12:28:27.256  18000-18000/com.test.eyalcherevatzki.clientserver E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length

我还添加了INTERNET 权限。
我实际上是在 DrJava 上运行服务器,这可能是问题所在吗?

我收到错误消息:“IOException: socket failed: ACCESS (Permission denied)”。

【问题讨论】:

  • 你也可以发布你的AndroidManifest.xml 吗?
  • @NoName 添加了日志猫
  • @JibranKhan 添加了清单
  • 我认为应该有NetworkOnMainThreadException,因为socket代码在主线程中运行。
  • @yummy 在服务器代码中?

标签: android client-server ioexception


【解决方案1】:

在setContentView()下面写下这个sn-p

 if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

class MyTask extends AsyncTask<Void, Void, Void> {

@Override
protected void onPreExecute() {
  super.onPreExecute();
  }

@Override
protected Void doInBackground(Void... params) {
  // Do your request
}

@Override
protected void onPostExecute(Void result) {
  super.onPostExecute(result);

}
 }

【讨论】:

  • 解释一下如何?
  • 关闭 StrictMode 根本不是一个好方法。试试 asynctask。
【解决方案2】:

当应用程序尝试在其主线程上执行网络操作时,将抛出异常 NetworkOnMainThreadException

所以你需要在一个新的Thread or AsyncTask中执行网络操作。

以下是示例,

public void onClick(View v) {

    s = et.getText().toString();
    et.setText("");
    /*run socket related code in new thread*/
    new Thread(){
       public void run() {
          try {
               client = new Socket("192.168.1.14", 4444);
               printWriter = new PrintWriter(client.getOutputStream(), true);
               printWriter.write(s);

               printWriter.flush();
               printWriter.close();
               client.close();
           } catch (UnknownHostException ex) {
               ex.printStackTrace();
           } catch (IOException ex) {
               ex.printStackTrace();
           }
        }
    }.start();


}

在示例代码中printStackTrace() 将在发生错误时打印日志跟踪。

【讨论】:

  • 现在我没有触发异常。但我没有看到服务器有任何变化。也许IP应该是别的东西?
  • 首先查看日志看是否有异常抛出。
  • 有一个SocketException被抛出。
  • 你能发布完整的日志跟踪吗?
  • 你能找到问题吗?
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多