Saturday, February 8, 2014

Android Server/Client example - client side using Socket

It's the client side implementation of our Server/Client example, the server side is listed in last post "server side using ServerSocket".

Android client side using Socket
Android client side using Socket

package com.example.androidclient;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 TextView textResponse;
 EditText editTextAddress, editTextPort; 
 Button buttonConnect, buttonClear;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  editTextAddress = (EditText)findViewById(R.id.address);
  editTextPort = (EditText)findViewById(R.id.port);
  buttonConnect = (Button)findViewById(R.id.connect);
  buttonClear = (Button)findViewById(R.id.clear);
  textResponse = (TextView)findViewById(R.id.response);
  
  buttonConnect.setOnClickListener(buttonConnectOnClickListener);
  
  buttonClear.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    textResponse.setText("");
   }});
 }
 
 OnClickListener buttonConnectOnClickListener = 
   new OnClickListener(){

    @Override
    public void onClick(View arg0) {
     MyClientTask myClientTask = new MyClientTask(
       editTextAddress.getText().toString(),
       Integer.parseInt(editTextPort.getText().toString()));
     myClientTask.execute();
    }};

 public class MyClientTask extends AsyncTask<Void, Void, Void> {
  
  String dstAddress;
  int dstPort;
  String response = "";
  
  MyClientTask(String addr, int port){
   dstAddress = addr;
   dstPort = port;
  }

  @Override
  protected Void doInBackground(Void... arg0) {
   
   Socket socket = null;
   
   try {
    socket = new Socket(dstAddress, dstPort);
    
    ByteArrayOutputStream byteArrayOutputStream = 
                  new ByteArrayOutputStream(1024);
    byte[] buffer = new byte[1024];
    
    int bytesRead;
    InputStream inputStream = socket.getInputStream();
    
    /*
     * notice:
     * inputStream.read() will block if no data return
     */
             while ((bytesRead = inputStream.read(buffer)) != -1){
                 byteArrayOutputStream.write(buffer, 0, bytesRead);
                 response += byteArrayOutputStream.toString("UTF-8");
             }

   } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = "UnknownHostException: " + e.toString();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = "IOException: " + e.toString();
   }finally{
    if(socket != null){
     try {
      socket.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
   return null;
  }

  @Override
  protected void onPostExecute(Void result) {
   textResponse.setText(response);
   super.onPostExecute(result);
  }
  
 }

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />
    <EditText 
        android:id="@+id/address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="dstAddress" />
    <EditText 
        android:id="@+id/port"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="dstPort" />
    <Button 
        android:id="@+id/connect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Connect..."/>
    <Button 
        android:id="@+id/clear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Clear"/>
    <TextView
        android:id="@+id/response"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Remark: uses-permission of "android.permission.INTERNET" is needed.

download filesDownload the files.



Related:
- Node.js server communicate with Android client

*** Updated example: Bi-directional communication between Client and Server, using ServerSocket, Socket, DataInputStream and DataOutputStream.

34 comments:

  1. Works like a charm .... Awesome

    ReplyDelete
  2. dear andr.oid eric, i created one application where socket programmin g is used, and that application not running on android version 4.0 and later.. i wnat ur help

    ReplyDelete
  3. hmm... i try to connect android device to server but it didn't well
    if i try to eclipse emulator instead of android device, it works well
    both of them, same situation. only emulator, android device difference
    can you answer about my problem??
    What can i check to solve this problem?

    ReplyDelete
  4. I am using hyperterminal to pass data to my android phone through wifi the data is being displayed on my phone at a random time and the data is scrambled and lot of extra garbage is also there, pls help!!

    ReplyDelete
  5. I can't download the project file. The page doesn't loading.

    ReplyDelete
  6. Hi...
    Nice tutorial but i can not run it on my phone. How do i run it on my phone? Please help!!!

    ReplyDelete
  7. Thank you for posting this; it worked great on the emulator!

    I'll be migrating this app to a phone shortly. I'd also like to expand functionality to have indicators that display data sent from the server; do you have any posts on how I could achieve this? I'm new to Android and the site so will be rooting around in the coming days.

    Thanks again!

    ReplyDelete
  8. hello..! sir
    I am new to scripting language.. would you help me to learn this android scripting language by suggesting some useful links.

    ReplyDelete
  9. Its really great, but in case when i don't know about the server ip address then how can i connect with server as a client plzz tell me...!

    ReplyDelete
  10. How can i user it for Instant messaging app in Android? And how to retrive port number from user while they initiate IM.

    ReplyDelete
  11. Hello,,,im just thinking if it is possible to divide the codes on connect button. by creating 2 buttons[connect,send].connect is just simply notify you if its connected, then send is to send a message to the server. can anyone help me?

    ReplyDelete
  12. I want to know which protocol is being used here. Is it telnet protocol ?

    ReplyDelete
  13. Awesome ..works very well..:-)

    ReplyDelete
  14. Is it working over 4G connection? each device are not in same local network but have 4G connection. But I cannot send the socket. Pls how to solve it

    ReplyDelete
  15. hello san,

    I haven't tried on mobile network. Somebody said the service provider will block the ports. So actually cannot, because of the mobile network service, not by the program.

    ReplyDelete
  16. ThanQ very Much For Best Script
    It is Most Use full For Me But I have Some Problem is There any way to Read
    Server Mobile Local Ip Address
    i dont want enter Manually ip address in client side Mobile

    ReplyDelete
  17. hello The Creator,

    I have no any good idea for your question.

    Anyway, you can scan ip in your network, to find which devices can be reached. Scan Reachable IP to discover devices in network

    ReplyDelete
  18. Dear Sir,
    Your code work fine,
    But I want create once clientThread and reuse it to send different massages to server
    because I need to send massage within one millisecond to the server

    ReplyDelete
  19. How can I use this with different network. It works only when both thw server an clients are in same networks.

    ReplyDelete
  20. hello ranjitha ak,

    In my understanding, it depends on network setting, not related to the program.

    ReplyDelete
  21. Thanks for this tutorial, I am usually worried over the fact that people would take time to comment on ur work(post) but you find it very difficult to reply them especially when they need it.

    ReplyDelete
  22. Hi, Can anybody tell about UDP communication?

    ReplyDelete
  23. This program only partially works for me - pressing connect does show correct messages on the server device, but the client app only receives the input stream the one time into the buffer, then "inputStream.read(buffer)" receives no more data from the server and blocks the thread - i.e. never exits the while loop below.

    while ((bytesRead = inputStream.read(buffer)) != -1){
    byteArrayOutputStream.write(buffer, 0, bytesRead);
    response += byteArrayOutputStream.toString("UTF-8");
    }

    ReplyDelete
  24. Appreciate your time for such a great tutorial...its Awesome, Loved it...simply the best :)

    ReplyDelete
  25. Hi,
    Is it possible to do in UDP? I am working on this type of my student project.

    Thanks

    ReplyDelete
  26. It is better to close inputstream after read data:

    ...

    InputStream inputStream = socket.getInputStream();

    ...

    inputStream.close();

    ReplyDelete
  27. Great example I was struggling with it before I found this post.
    I just can figure out how to send a String to the client?
    Do I add the String to the ByteArrayOutputStream?

    If you can show me I would appreciate it, Thanks.

    ReplyDelete
  28. Being new to this and would like to learn more. At present want to use android device with graphical buttons to send various commands via telnet?? Or other bidirectional protocol. Any help or links would be appreciated.

    ReplyDelete
  29. Please Share more Tutorials

    Very Interesting Blog Post .Now a Days All the People in the world are Connected together by the Technology. Mainly makes human life Much Easier.
    I Liiiike this tutorial

    ReplyDelete
  30. Very informative. Thanks for posting

    ReplyDelete
  31. Not working for multiple devices connection.

    ReplyDelete