Android Introduction Hello Threads @2010 Mihail L. Sichitiu 1 Goal Create an application that uses a background thread as a UDP server to receive messages from the UDP client @2010 Mihail L. Sichitiu 152.4.244.125 Text sent from UDPClient 2 Layout TextView that changes from “Starting Server” to “Server Started” (optional) 152.4.244.125 TextView that shows the IP address of the server (needed for UDPClient) Text sent from UDPClient Clear Button – clears the Last Message (and shows that interface is still responsive) TextView that shows the text sent from UDPClient @2010 Mihail L. Sichitiu 3 Application Structure ServerThread Main Activity OnCreate( ) Constructor Create the thread Start the thread UDPClient Read line from input Open the Socket If successful – “Server Started” Find and display the IP Address run( ) Message Handler while (socketStillOpen){ receive packet display Message send reply } OnDestroy( ) Send line to Server Receive line from Server close the socket OnClickListener( ) Display line Clear the Last Message HelloThreads @2010 Mihail L. Sichitiu UDPClient 4 Main Activity (HelloThreads) ClassMembers TextView isRunning,myIPAddressField,lastMessage; Button clear; ServerThread myThread; Handler OnCreate( ) Get handles (findViewById) to all GUI elements Create ServerThread: myThread=new ServerThread(getApplicationContext(),mHandler) Start the Thread: myThread.start(); Register the OnClickListener for the Clear Button OnDestroy( ) Handler Definition on Next page myThread.closeSocket(); OnClickListener( ) Clear the Last Message @2010 Mihail L. Sichitiu 5 The Handler Definition private final Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case PACKET_CAME: String incomingMessage = (String) msg.obj; lastMessage.setText(incomingMessage); break; case IS_RUNNING: String socketStatus = (String) msg.obj; isRunning.setText(socketStatus); break; case IP_ADDRESS: InetAddress myIPAddress = (InetAddress) msg.obj; myIPAddressField.setText("Server IP Address:"+myIPAddress.toString()); break; } } }; @2010 Mihail L. Sichitiu 6 ServerThread public class ServerThread extends Thread Class Members public ServerThread(Context currentContext,Handler handler){ mContext = currentContext; mHandler = handler; Open the socket; if successful mHandler.obtainMessage(HelloThreads2.IS_RUNNING, "Server On Next Started").sendToTarget(); Page InetAddress myIP = getMyWiFiIPAddress(); mHandler.obtainMessage(HelloThreads2.IP_ADDRESS, myIP).sendToTarget(); public void closeSocket() Handler mHandler; // link to the Message Handler Context mContext; // link to application context DatagramSocket serverSocket; // the UDP socket we’ll receive at serverSocket.close(); public void run() On Next Next Page @2010 Mihail L. Sichitiu Allows the socket to be closed (call from OnDestroy()) 7 Getting the IP Address: getMyWiFiIPAddress( ); WifiManager mWifi = (WifiManager) (mContext.getSystemService(Context.WIFI_SERVICE)); WifiInfo info = mWifi.getConnectionInfo(); DhcpInfo dhcp = mWifi.getDhcpInfo(); int myIntegerIPAddress = dhcp.ipAddress; byte[] quads = new byte[4]; for (int k = 0; k < 4; k++) quads[k] = (byte) ((myIntegerIPAddress>> k * 8) & 0xFF); try{ InetAddress myIPAddress = InetAddress.getByAddress(quads); return myIPAddress; }catch(Exception e){ if(D) Log.e(TAG,"Cannot Get My Own IP Address"); return null } @2010 Mihail L. Sichitiu 8 ServerThread.run( ) boolean socketOK=true; // True as long as we don't get socket errors Handles multiple requests as long as the socket is OK while(socketOK) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); try{ Blocks serverSocket.receive(receivePacket); /*** ..... Same as the UDP server ........ ****/ mHandler.obtainMessage(HelloThreads2.PACKET_CAME,sentence). sendToTarget(); } catch (Exception e){ To the socketOK = false; Message Handler in the }// try main Thread }// while(socketOK) @2010 Mihail L. Sichitiu 9 Android Manifest To be able to use the Internet (open sockets) and to read our own IP address (from the WiFi Manager): <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> @2010 Mihail L. Sichitiu 10