Code that should connect to a Server running locally on my PC is not working. This is part of an assignment that seems to work for other people. I have checked things like Firewall, right address and port sense checks, port forwarding etc. Installing a Telnet app on the emulator proves that from the emulator using 10.0.2.2 I can reach the Python server running on my PC at 127.0.0.1.
Here is the code, where I have tried various methods to try and iron out potential InetAddress or Socket problems:
package uk.ac.man.cs.COMP28512.lab4;
import android.app.Activity;
import android.util.Log;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Created by leeming
* Code snippets from http://examples.javacodegeeks.com/android/core/socket-core/android-socket-example/
*/
public class ServerConnect extends Thread{
public static final int BUFFER_SIZE = 2048;
private Socket socket;
private static final int SERVERPORT = 9999; //This is the port that we are connecting to
//Remember the channel simulator is 9998
private static final String SERVERIP = "10.0.2.2"; //This address is magically mapped to the host's loopback.
private static final String LOGTAG = "SocketTester";
boolean terminated = false;
private PrintWriter out = null;
private BufferedReader in = null;
Activity parentref;
/**
*
* @param parentRef Expects a reference to the calling activity, e.g. new ServerConnect(this);
*/
public ServerConnect(Activity parentRef)
{
parentref=parentRef;
}
/**
* Sends commands to the server. Called from UI thread via a button press
* @param cmd
*/
public void send(String cmd)
{
try
{
Log.i(LOGTAG,"Sending command: "+cmd);
out.println(cmd);
}
catch(Exception e)
{
Log.e(LOGTAG,"Failed to send command : "+e);
}
}
/**
* Main thread loop that grabs incoming messages
*/
public void run()
{
Log.i(LOGTAG,"Running socket thread");
try
{
// InetAddress svrAddr = InetAddress.getByName(SERVERIP);
byte[] Addr = new byte[]{10,0,2,2};
InetAddress svrAddr = InetAddress.getByAddress(Addr);
System.out.println("ADDRESS: " + svrAddr.toString());
/*
String IP = svrAddr.toString().substring(1);
InetAddress realAddr = InetAddress.getByName(IP);
System.out.println(IP);
System.out.println(realAddr.getAddress().toString());
*/
socket = new Socket(svrAddr, SERVERPORT);
// if (realAddr.isReachable(1000))
// System.out.println("Successfully reached");
//Setup i/o streams
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//Keep listening for messages from server
while(!terminated)
{
final String message = in.readLine();
if(message != null && message != "")
{
Log.i(LOGTAG,"MSG recv : "+message);
//Update GUI with any server responses
final TextView txtv = (TextView) parentref.findViewById(R.id.txtServerResponse);
parentref.runOnUiThread(new Runnable() {
@Override
public void run() {
/**
*
*
* This is where the the UI gets updated by the socket
*
*
*/
txtv.setText(message+"\n"+txtv.getText());
}
});
}
}
}
catch (UnknownHostException uhe)
{
Log.e(LOGTAG,"Unknownhost\n"+uhe.getStackTrace().toString());
}
catch (Exception e) {
Log.e(LOGTAG, "Socket failed\n"+e.getMessage());
e.printStackTrace();
}
disconnect();
Log.i(LOGTAG,"Thread now closing");
}
/**
* Disconnect from the server as well as closing i/o streams
*/
public void disconnect()
{
Log.i(LOGTAG, "Disconnecting from server");
try
{
in.close();
out.close();
}
catch(Exception e)
{/*do nothing*/}
try
{
socket.close();
}
catch(Exception e)
{/*do nothing*/}
}
}
And here is what I get as log output:
03-30 21:08:39.846 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/MainPAge﹕ onCreate entered
03-30 21:08:39.852 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/SocketTester﹕ Running socket thread
03-30 21:08:39.861 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/System.out﹕ ADDRESS: /10.0.2.2
03-30 21:08:39.867 1115-1115/uk.ac.man.cs.COMP28512.lab4 E/SocketTester﹕ Socket failed
null
03-30 21:08:39.868 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ android.os.NetworkOnMainThreadException
03-30 21:08:39.898 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
03-30 21:08:39.898 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
03-30 21:08:39.898 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
03-30 21:08:39.898 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
03-30 21:08:39.899 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
03-30 21:08:39.899 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
03-30 21:08:39.899 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.Socket.startupSocket(Socket.java:590)
03-30 21:08:39.899 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.Socket.<init>(Socket.java:226)
03-30 21:08:39.912 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at uk.ac.man.cs.COMP28512.lab4.ServerConnect.run(ServerConnect.java:85)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at uk.ac.man.cs.COMP28512.lab4.MainActivity.onCreate(MainActivity.java:33)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5933)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.access$800(ActivityThread.java:144)
03-30 21:08:39.913 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5221)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-30 21:08:39.914 1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
03-30 21:08:39.915 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/SocketTester﹕ Disconnecting from server
03-30 21:08:39.918 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/SocketTester﹕ Thread now closing
03-30 21:08:39.982 1115-1132/uk.ac.man.cs.COMP28512.lab4 D/OpenGLRenderer﹕ Render dirty regions requested: true
03-30 21:08:40.002 1115-1115/uk.ac.man.cs.COMP28512.lab4 D/﹕ HostConnection::get() New Host Connection established 0xaeef7a20, tid 1115
03-30 21:08:40.086 1115-1115/uk.ac.man.cs.COMP28512.lab4 D/Atlas﹕ Validating map...
03-30 21:08:40.437 1115-1132/uk.ac.man.cs.COMP28512.lab4 D/﹕ HostConnection::get() New Host Connection established 0xaeef74a0, tid 1132
03-30 21:08:40.508 1115-1132/uk.ac.man.cs.COMP28512.lab4 I/OpenGLRenderer﹕ Initialized EGL, version 1.4
03-30 21:08:40.605 1115-1132/uk.ac.man.cs.COMP28512.lab4 D/OpenGLRenderer﹕ Enabling debug mode 0
03-30 21:08:40.677 1115-1132/uk.ac.man.cs.COMP28512.lab4 W/EGL_emulation﹕ eglSurfaceAttrib not implemented
03-30 21:08:40.678 1115-1132/uk.ac.man.cs.COMP28512.lab4 W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa7a3b2e0, error=EGL_SUCCESS
03-30 21:08:40.812 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/Choreographer﹕ Skipped 39 frames! The application may be doing too much work on its main thread.
03-30 21:08:41.773 1115-1115/uk.ac.man.cs.COMP28512.lab4 I/Choreographer﹕ Skipped 57 frames! The application may be doing too much work on its main thread.
Looking at the errors and following them through I can't make sense of what could be causing the Socket to be unable to be created.
See What's the difference between Thread start() and Runnable run()
Looks like you are calling run() directly instead of via start().