Socket Programming

107

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="wrap_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/EditText01" android:layout_height="wrap_content">
</EditText>
<Button android:text="Button" android:id="@+id/myButton" android:layout_width="wrap_content" 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"> </uses-permission>

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 = 0x1337;
   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(new InputStreamReader(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 THAT'S MY DEV'T MACHINE WHERE PACKETS TO
   // PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S
   // 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(new OutputStreamWriter(socket.getOutputStream())),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 :

Did you enjoy this article?
Share
the
Love
Get Free Updates

107 Responses

  1. covith says:

    I test it already, it done well. but i use it on the real phone its have no the result. so now could u share me the source code to chat on phone? many thanks.

  2. vijaya says:

    It takes time to show the textview and edittext in client side and by clicking the button after entering the text in edittext it is showing error3 in the textview.

  3. Priyanka says:

    How to get port number if my server is wifi . I am building app where i want to switch on or off lights by app by sending command to wifi

  4. Ari says:

    i have copied this code onto my project, i have changed the ip address with my system ip address still im unable to get any text in my server emulator

    can anyone please point me out what am i doing wrong?

  5. Ari says:

    I’m getting this warning

    W/InputEventReceiver(1167): Attempted to finish an input event but the input event receiver has already been disposed.

    im checking in two emulators and the message is not send to the server emulator, i have done all that is necessary and mentioned here, what might i be missing??

  6. mario says:

    there’s a problem with client

  7. eisha says:

    hi… very informative post thanks.. i want to ask u that what if i want to maintain a database at server side and accept database values from client side???? if u have any idea share with me it will be a great help for me

Leave a Reply


+ eight = 17

Proudly designed by Theme Junkie.