package com.phinominal.onboard; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.Enumeration; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.widget.TextView; public class ServerActivity extends Activity { private TextView serverStatus; // default ip public static String SERVERIP = "10.0.2.15"; // designate a port public static final int SERVERPORT = 8080; private Handler handler = new Handler(); private ServerSocket serverSocket; private OutputStreamWriter out; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.server); serverStatus = (TextView) findViewById(R.id.server_status); SERVERIP = getLocalIpAddress(); Thread fst = new Thread(new ServerThread()); fst.start(); } public class ServerThread implements Runnable { public void run() { try { if (SERVERIP != null) { handler.post(new Runnable() { public void run() { serverStatus.setText("Listening on IP: " + SERVERIP); Log.e("OUTPUT", "Got IP, now listening..."); } }); serverSocket = new ServerSocket(SERVERPORT); while (true) { // listen for incoming clients Socket client = serverSocket.accept(); handler.post(new Runnable() { public void run() { serverStatus.setText("Connected."); } }); try { BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); OutputStream sock_out= client.getOutputStream(); OutputStream bout= new BufferedOutputStream(sock_out); out = new OutputStreamWriter(bout, "8859_1"); String line = null; while ((line = in.readLine()) != null) { Log.d("ServerResponse: ", line); out.write(handleInputCommand(line)); out.flush(); // Don't forget to flush! handler.post(new Runnable() { public void run() { // do whatever you want to the front end // this is where you can be creative } }); } break; } catch (UnsupportedEncodingException e) { Log.d("StreamError: ", "This VM does not support the Latin-1 character set."); } catch (Exception e) { handler.post(new Runnable() { public void run() { serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); } }); e.printStackTrace(); } } } else { handler.post(new Runnable() { public void run() { serverStatus.setText("Couldn't detect internet connection."); } }); } } catch (Exception e) { handler.post(new Runnable() { public void run() { serverStatus.setText("Error"); } }); e.printStackTrace(); } } } // gets the ip address of the phone's network private String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e("ServerActivity", ex.toString()); } return null; } private String handleInputCommand(String input) { return input; } @Override protected void onStop() { super.onStop(); try { // make sure you close the socket upon exiting serverSocket.close(); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }