Sei sulla pagina 1di 7

Socket Programming

Posted by Sushant on August 17, 2011, filed in: Android Development, Android Programming Tutorials

3
This is a sample program that uses socket class to make a chat application, by this you can create a Server and a Client in two Emulator and chat to write and read data. Underlying Algorithm: Basic description of algorithm in step by step form: 1.) Create Two Projects one for server MyServer and another for client ServerClient. 2.) Put the following code snippet in res folder of MyServer project res/layout/main.xml : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <TextView android:text="TextView" android:id="@+id/TextView01"android:layout_width="wr ap_content" android:layout_height="wrap_content"> </TextView> </LinearLayout> 3.) Put the following code snippet in res folder of ServerClient project res/layout/main.xml : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:id="@+id/myTextView" /> <EditText android:text="EditText" android:layout_width="fill_parent"android:id="@+id/E ditText01" android:layout_height="wrap_content"> </EditText> <Button android:text="Button" android:id="@+id/myButton"android:layout_width="wrap_con tent" android:layout_height="wrap_content"> </Button> </LinearLayout>

4.) Add the following permissions in AndroidManifest.xml of both project : <uses-permission android:name="android.permission.INTERNET"> </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> </usespermission> 5.) Redirect the port : i) run -> cmd -> telnet localhost 5554 ii) redir add tcp:5000:6000 6.) Run the both applications. Steps to Create Server: 1.) Open Eclipse. Use the New Project Wizard and select Android Project Give the respective project name i.e. MyServer. Enter following information: Project name: MyServer Build Target: Android APIs 2.1 Application name: MyServer Package name: com.app. MyServer Create Activity: MyServer

On Clicking Finish MyServer code structure is generated with the necessary Android Packages being imported along with MyServer.java. MyServer class will look like following: package com.app.MyServer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.os.Handler;

import android.os.Message; import android.widget.TextView; public class MyServer extends Activity { ServerSocket ss = null; String mClientMsg = ""; Thread myCommsThread = null; protected static final int MSG_ID = 01337; public static final int SERVERPORT = 6000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.TextView01); tv.setText("Nothing from client yet"); this.myCommsThread = new Thread(new CommsThread()); this.myCommsThread.start(); } @Override protected void onStop() { super.onStop(); try { // make sure you close the socket upon exiting ss.close(); } catch (IOException e) { e.printStackTrace(); } } Handler myUpdateHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MSG_ID: TextView tv = (TextView) findViewById(R.id.TextView01); tv.setText(mClientMsg); break; default: break; } super.handleMessage(msg); } }; class CommsThread implements Runnable { public void run() { Socket s = null; try { ss = new ServerSocket(SERVERPORT );

} catch (IOException e) { e.printStackTrace(); } while (!Thread.currentThread().isInterrupted()) { Message m = new Message(); m.what = MSG_ID; try { if (s == null) s = ss.accept(); BufferedReader input = new BufferedReader(newInputStreamReader(s.getInputStream())); String st = null; st = input.readLine(); mClientMsg = st; myUpdateHandler.sendMessage(m); } catch (IOException e) { e.printStackTrace(); } } } } } Steps to Create Client: 2.) Open Eclipse. Use the New Project Wizard and select Android Project Give the respective project name i.e. ServerClient. Enter following information: Project name: ServerClient Build Target: Android APIs 2.1 Application name: ServerClient Package name: com.app.ServerClient Create Activity: ServerClient

On Clicking Finish ServerClient code structure is generated with the necessary Android Packages being imported along with ServerClient.java. ServerClient class will look like following: package com.app.ServerClient; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.view.View; public class SocketClient extends Activity { private Button bt; private TextView tv; private Socket socket; private String serverIpAddress = "10.0.2.2"; // AND THATS MY DEVT MACHINE WHERE PACKETS TO // PORT 5000 GET REDIRECTED TO THE SERVER EMULATORS // PORT 6000 private static final int REDIRECTED_SERVERPORT = 5000; @Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.main); bt = (Button) findViewById(R.id.myButton); tv = (TextView) findViewById(R.id.myTextView); try { InetAddress serverAddr = InetAddress.getByName(serverIpAddress); socket = new Socket(serverAddr, REDIRECTED_SERVERPORT); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } bt.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { EditText et = (EditText) findViewById(R.id.EditText01); String str = et.getText().toString(); PrintWriter out = new PrintWriter(new BufferedWriter(newOutputStreamWriter(socket.get OutputStream())),true); out.println(str); Log.d("Client", "Client sent message"); } catch (UnknownHostException e) { tv.setText("Error1"); e.printStackTrace(); } catch (IOException e) { tv.setText("Error2"); e.printStackTrace(); } catch (Exception e) { tv.setText("Error3"); e.printStackTrace(); } } }); } } Output The final output: Client :

Server :

Potrebbero piacerti anche