The server socket helps you to connect the clients with server. In this tutorial we are going to build a message delivering application in android using server socket in which you could connect multiple clients(android devices) to the server(PC).
Steps:
1. Create a java project and add the following classes
server.java
Sender.java
Receiver.java
DataHandler.Java
That's all for the server-side.
2.Copy and paste the below code to your android activity class.
3. Copy and paste the below xml to you layout xml file.
4.Finally add internet permission to your android manifest.
<uses-permission android:name="android.permission.INTERNET" >
Now run the server and connect as much as client!
Steps:
1. Create a java project and add the following classes
server.java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String args[]){
Socket s=null;
ServerSocket ss2=null;
System.out.println("Server Listening......");
try{
ss2 = new ServerSocket(4444); // can also use static final PORT_NUM , when defined
}
catch(IOException e){
e.printStackTrace();
System.out.println("Server error");
}
while(true){
try{
s= ss2.accept();
System.out.println("connection Established");
Reciever st=new Reciever(s);
st.start();
}
catch(Exception e){
e.printStackTrace();
System.out.println("Connection Error");
}
}
}
}//class ends
Sender.java
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class Sender {
private PrintWriter out;
public Sender(Socket clientSocket) {
try {
out = new PrintWriter(clientSocket.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessage(String message) {
out.println(message); // Print the message on output stream.
out.flush();
message="";
System.out.println("Server: " + message + "\n"); // Print the message on chat window.
}
}
Receiver.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
class Reciever extends Thread{
String line=null;
BufferedReader is = null;
PrintWriter os=null;
Socket s=null;
public Reciever(Socket s){
this.s=s;
}
public void run() {
try{
is= new BufferedReader(new InputStreamReader(s.getInputStream()));
os=new PrintWriter(s.getOutputStream());
}catch(IOException e){
System.out.println("IO error in server thread");
}
try {
line=is.readLine();
while(line.compareTo("QUIT")!=0){
os.println(line);
os.flush();
if(line.equals("syncDb")){
DataHandler a = new DataHandler();
a.syncDb(s);
break;
}
else{
//
System.out.println("Response to Client : "+line);
line=is.readLine();
}
}
} catch (IOException e) {
line=this.getName(); //reused String line for getting thread name
System.out.println("IO Error/ Client "+line+" terminated abruptly");
}
catch(NullPointerException e){
line=this.getName(); //reused String line for getting thread name
System.out.println("Client "+line+" Closed");
}
finally{
try{
System.out.println("Connection Closing..");
if (is!=null){
is.close();
System.out.println(" Socket Input Stream Closed");
}
if(os!=null){
os.close();
System.out.println("Socket Out Closed");
}
if (s!=null){
s.close();
System.out.println("Socket Closed");
}
}
catch(IOException ie){
System.out.println("Socket Close Error");
}
}//end finally
}
}
DataHandler.Java
import java.net.Socket;
public class DataHandler {
public static void syncDb(Socket s) {
Sender sender = new Sender(s);
sender.sendMessage("***start***");
sender.sendMessage("This is a message from the server");
sender.sendMessage("***stop***");
}
}
That's all for the server-side.
2.Copy and paste the below code to your android activity class.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
private Socket client;
private PrintWriter printwriter;
private BufferedReader bufferedReader;
private ProgressDialog pDialog;
String host;
int port;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* This AsyncTask create the connection with the server and initialize the
* chat senders and receivers.
*/
private class ChatOperator extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
try {
client = new Socket(host, port); // Creating the
// server socket.
if (client != null) {
printwriter = new PrintWriter(client.getOutputStream(),
true);
InputStreamReader inputStreamReader = new InputStreamReader(
client.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader);
} else {
System.out
.println("Server has not bean started on port 4444.");
}
} catch (UnknownHostException e) {
System.out.println("Faild to connect server " + host);
e.printStackTrace();
} catch (IOException e) {
System.out.println("Faild to connect server " + host);
e.printStackTrace();
}
return null;
}
/**
* Following method is executed at the end of doInBackground method.
*/
@Override
protected void onPostExecute(Void result) {
final Sender messageSender = new Sender(); // Initialize chat sender
// AsyncTask.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
messageSender.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
messageSender.execute();
}
Receiver receiver = new Receiver(); // Initialize chat receiver
// AsyncTask.
receiver.execute();
}
}
/**
* This AsyncTask continuously reads the input buffer and show the chat
* message if a message is availble.
*/
private class Receiver extends AsyncTask<Void, Void, Void> {
private String message;
@Override
protected Void doInBackground(Void... params) {
while (true) {
try {
if (bufferedReader.ready()) {
message = bufferedReader.readLine();
publishProgress(null);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
}
@Override
protected void onProgressUpdate(Void... values) {
try {
Toast.makeText(getApplicationContext(),
"Received message: "+message, Toast.LENGTH_LONG).show();
} catch (Exception e) {
// TODO: handle exception
}
}
}
/**
* This AsyncTask sends the chat message through the output stream.
*/
private class Sender extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
printwriter.write("message from client" + "\n");
printwriter.flush();
Log.d("message", "send");
return null;
}
@Override
protected void onPostExecute(Void result) {
}
}
public void LoadAndSave(View v) {
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Loading meassage. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
ChatOperator chatOperator = new ChatOperator();
chatOperator.execute();
}
}// activity ends
3. Copy and paste the below xml to you layout xml file.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="172dp"
android:stretchColumns="1" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginTop="20dp"
android:onClick="LoadAndSave"
android:text="send a message to server" />
</TableLayout>
</ScrollView>
4.Finally add internet permission to your android manifest.
<uses-permission android:name="android.permission.INTERNET" >
Now run the server and connect as much as client!
No comments:
Post a Comment