Search code examples
androidtcpsocketexception

Android TCP Socket Error


i recently wanted to create an application on android which connects to a c# server via tcp. The Server is created and listens also Ports are opened.

The Problem is the error which my android application causes:

    07-20 02:11:52.057 1262-1262/connector.de.connect2 W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
07-20 02:11:52.122 1262-1262/connector.de.connect2 D/MyApp: I am here
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err: java.net.SocketException: socket failed: EACCES (Permission denied)
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err:     at libcore.io.IoBridge.socket(IoBridge.java:619)
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err:     at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err:     at java.net.Socket.startupSocket(Socket.java:584)
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err:     at java.net.Socket.tryAllAddresses(Socket.java:128)
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err:     at java.net.Socket.<init>(Socket.java:178)
07-20 02:11:52.122 1262-1262/connector.de.connect2 W/System.err:     at java.net.Socket.<init>(Socket.java:150)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at connector.de.connect2.MainActivity.onCreate(MainActivity.java:41)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.Activity.performCreate(Activity.java:6251)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.os.Looper.loop(Looper.java:148)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5466)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err: Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at libcore.io.Posix.socket(Native Method)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:     at libcore.io.IoBridge.socket(IoBridge.java:604)
07-20 02:11:52.123 1262-1262/connector.de.connect2 W/System.err:    ... 18 more

I read that my application is missing the following code in the manifest.xml

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

I tried many versions including "ACCESS_NETWORK_STATE", "ACCESS_NETWORK_STATE" etc.

Either nothing changes and the error still appears or the app crashes completely.

I dont know what to do.

If it also helps the code of the application itself is here:

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

        Log.d("MyApp","I am here");
        try
        {
            Socket socket = new Socket("192.168.1.3", 1071);
            PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            pw.println("Hello");
            socket.close();
        }
        catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

And here the Manifest.xml with the tried changes:

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

    <uses-sdk android:minSdkVersion="14" />
    <use-permission android:name="android.permission.INTERNET" />
    <use-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <use-permission android:name="android.permission.ACCESS_WIFI_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>

</manifest>

Solution

  • The logcat output you've provided doesn't show it for some reason, but you cannot perform network operations on the main thread (e.g. inside of onCreate()). You need to offload network operations to a background thread of some kind.