0

I have made both a client and server program with Java to control my PC over a network and was all working correctly. I am now in the process of changing the client over to an Android application and am coming across issues opening a socket.

Outside method:

private PrintWriter clientMessage;
private Socket socket;
private int port = 1234;

onClick of connect button:

try {
    System.out.println("a");
    InetAddress IP = InetAddress.getByName("192.168.0.12");
    System.out.println("a");

    System.out.println("b");
    socket = new Socket(IP, port);
    System.out.println("b");

    connected = true;
    System.out.println("connected");
    clientMessage = new PrintWriter(socket.getOutputStream(), true);
}
catch (IOException ex) {
    System.out.println("error connecting");
}

The console returns:

12-07 23:59:50.812 I/System.out: a
12-07 23:59:50.812 D/libc: [NET] android_getaddrinfofornet+,hn 12(0x3139322e313638),sn(),hints(known),family 0,flags 4
12-07 23:59:50.812 D/libc: [NET] android_getaddrinfofornet-, SUCCESS
12-07 23:59:50.812 I/System.out: a
12-07 23:59:50.812 I/System.out: b
12-07 23:59:50.812 I/System.out: error connecting

... on the click of connect button. From the a/b markers I can see the issue is occurring on creating the socket.

This code is pretty much what I used for the client when it was a Java application so not really sure what's going wrong here?

Very new to Android so sorry if it's obvious - thanks in advance!

note: port number and IP address are correct for server and server is open and running correctly, so it isn't that.

Edit 1:

Stack trace for IOException being thrown:

W/System.err: java.net.SocketException: socket failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.socket(IoBridge.java:623)
W/System.err:     at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
W/System.err:     at java.net.Socket.startupSocket(Socket.java:582)
W/System.err:     at java.net.Socket.<init>(Socket.java:226)
W/System.err:     at kaihulme.remoteapplication.MainActivity.onClick(MainActivity.java:80)
W/System.err:     at android.view.View.performClick(View.java:4756)
W/System.err:     at android.view.View$PerformClick.run(View.java:19749)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:135)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5221)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
W/System.err: Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
W/System.err:     at libcore.io.Posix.socket(Native Method)
W/System.err:     at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
W/System.err:     at libcore.io.IoBridge.socket(IoBridge.java:608)
W/System.err:   ... 14 more

Edit 2:

Added the permission:

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

... to the Android manifest after looking at Error message 'java.net.SocketException: socket failed: EACCES (Permission denied)' and received the following error:

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: kaihulme.remoteapplication, PID: 24959
                  android.os.NetworkOnMainThreadException
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
                      at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
                      at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
                      at libcore.io.IoBridge.connect(IoBridge.java:122)
                      at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
                      at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
                      at java.net.Socket.startupSocket(Socket.java:590)
                      at java.net.Socket.<init>(Socket.java:226)
                      at kaihulme.remoteapplication.MainActivity.onClick(MainActivity.java:80)
                      at android.view.View.performClick(View.java:4756)
                      at android.view.View$PerformClick.run(View.java:19749)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5221)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
I/Process: Sending signal. PID: 24959 SIG: 9

Edit 3:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kaihulme.remoteapplication">
    <uses-permission android:name="android.permission.INTERNET"/>
    <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"
            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>
Community
  • 1
  • 1
Kai Hulme
  • 41
  • 9
  • is the android on the same network as the PC? is there any firewall in the way? Can you ping the PC from the android? – Scary Wombat Dec 08 '15 at 00:20
  • 1
    could you provide the stack trace for the IOException being thrown? – novak Dec 08 '15 at 00:33
  • @ScaryWombat Yes they are on the network (have also tried with an emulator on the same PC and get the same result). I also believe there is no firewall issues as it worked as a Java application rather than an Android application (but could be mistaken), check stack trace in edits. – Kai Hulme Dec 08 '15 at 20:32
  • @novak Edit shows stack trace for IOException – Kai Hulme Dec 08 '15 at 20:33
  • Have a look to see if you have the internet permission in your AndroidManifest.xml `` – novak Dec 08 '15 at 20:42
  • @novak Just added that - no luck... got a different error though. Added manifest to edits. – Kai Hulme Dec 08 '15 at 20:55
  • You'll need to perform any network operations on a background thread. If you attempt to open on the main thread it will freeze the application. – novak Dec 08 '15 at 21:51
  • @novak how would I do this? - sorry very new to Android (and Java I guess) – Kai Hulme Dec 09 '15 at 14:24

0 Answers0