
- Android Basics
- Android - Home
- Android - Overview
- Android - Environment Setup
- Android - Architecture
- Android - Application Components
- Android - Hello World Example
- Android - Resources
- Android - Activities
- Android - Services
- Android - Broadcast Receivers
- Android - Content Providers
- Android - Fragments
- Android - Intents/Filters
- Android - User Interface
- Android - UI Layouts
- Android - UI Controls
- Android - Event Handling
- Android - Styles and Themes
- Android - Custom Components
- Android Advanced Concepts
- Android - Drag and Drop
- Android - Notifications
- Location Based Services
- Android - Sending Email
- Android - Sending SMS
- Android - Phone Calls
- Publishing Android Application
- Android Useful Examples
- Android - Alert Dialoges
- Android - Animations
- Android - Audio Capture
- Android - AudioManager
- Android - Auto Complete
- Android - Best Practices
- Android - Bluetooth
- Android - Camera
- Android - Clipboard
- Android - Custom Fonts
- Android - Data Backup
- Android - Developer Tools
- Android - Emulator
- Android - Facebook Integration
- Android - Gestures
- Android - Google Maps
- Android - Image Effects
- Android - ImageSwitcher
- Android - Internal Storage
- Android - JetPlayer
- Android - JSON Parser
- Android - Linkedin Integration
- Android - Loading Spinner
- Android - Localization
- Android - Login Screen
- Android - MediaPlayer
- Android - Multitouch
- Android - Navigation
- Android - Network Connection
- Android - NFC Guide
- Android - PHP/MySQL
- Android - Progress Circle
- Android - ProgressBar
- Android - Push Notification
- Android - RenderScript
- Android - RSS Reader
- Android - Screen Cast
- Android - SDK Manager
- Android - Sensors
- Android - Session Management
- Android - Shared Preferences
- Android - SIP Protocol
- Android - Spelling Checker
- Android - SQLite Database
- Android - Support Library
- Android - Testing
- Android - Text to Speech
- Android - TextureView
- Android - Twitter Integration
- Android - UI Design
- Android - UI Patterns
- Android - UI Testing
- Android - WebView Layout
- Android - Wi-Fi
- Android - Widgets
- Android - XML Parsers
- Android Useful Resources
- Android - Questions and Answers
- Android - Useful Resources
- Android - Discussion
Client-Server Programming in Android
This example demonstrate about Client-Server Programming in Android
Need Server and Client Project
Server
Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project.
Step 2 − Add the following code to res/layout/activity_main.xml.
<?xml version = "1.0" encoding = "utf-8"?> <RelativeLayout 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:layout_margin = "16dp" tools:context = ".MainActivity"> <TextView android:id = "@+id/tvIP" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" /> <TextView android:id = "@+id/tvPort" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_below = "@+id/tvIP" android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" /> <TextView android:id = "@+id/tvConnectionStatus" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_below = "@+id/tvPort" android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" /> <TextView android:id = "@+id/tvMessages" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_above = "@+id/etMessage" android:layout_below = "@+id/tvConnectionStatus" android:inputType = "textMultiLine" android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" /> <EditText android:id = "@+id/etMessage" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_above = "@+id/btnSend" android:hint = "Enter Message" android:inputType = "text" /> <Button android:id = "@+id/btnSend" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_alignParentBottom = "true" android:text = "SEND" /> </RelativeLayout>
Step 3 − Add the following code to src/MainActivity.java
package com.server.myapplication.server; import android.annotation.SuppressLint; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.ByteOrder; @SuppressLint("SetTextI18n") public class MainActivity extends AppCompatActivity { ServerSocket serverSocket; Thread Thread1 = null; TextView tvIP, tvPort; TextView tvMessages; EditText etMessage; Button btnSend; public static String SERVER_IP = ""; public static final int SERVER_PORT = 8080; String message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvIP = findViewById(R.id.tvIP); tvPort = findViewById(R.id.tvPort); tvMessages = findViewById(R.id.tvMessages); etMessage = findViewById(R.id.etMessage); btnSend = findViewById(R.id.btnSend); try { SERVER_IP = getLocalIpAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } Thread1 = new Thread(new Thread1()); Thread1.start(); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { message = etMessage.getText().toString().trim(); if (!message.isEmpty()) { new Thread(new Thread3(message)).start(); } } }); } private String getLocalIpAddress() throws UnknownHostException { WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); assert wifiManager ! = null; WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipInt = wifiInfo.getIpAddress(); return InetAddress.getByAddress(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(ipInt).array()).getHostAddress(); } private PrintWriter output; private BufferedReader input; class Thread1 implements Runnable { @Override public void run() { Socket socket; try { serverSocket = new ServerSocket(SERVER_PORT); runOnUiThread(new Runnable() { @Override public void run() { tvMessages.setText("Not connected"); tvIP.setText("IP: " + SERVER_IP); tvPort.setText("Port: " + String.valueOf(SERVER_PORT)); } }); try { socket = serverSocket.accept(); output = new PrintWriter(socket.getOutputStream()); input = new BufferedReader(new InputStreamReader(socket.getInputStream())); runOnUiThread(new Runnable() { @Override public void run() { tvMessages.setText("Connected
"); } }); new Thread(new Thread2()).start(); } catch (IOException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } } private class Thread2 implements Runnable { @Override public void run() { while (true) { try { final String message = input.readLine(); if (message ! = null) { runOnUiThread(new Runnable() { @Override public void run() { tvMessages.append("client:" + message + "
"); } }); } else { Thread1 = new Thread(new Thread1()); Thread1.start(); return; } } catch (IOException e) { e.printStackTrace(); } } } } class Thread3 implements Runnable { private String message; Thread3(String message) { this.message = message; } @Override public void run() { output.write(message); output.flush(); runOnUiThread(new Runnable() { @Override public void run() { tvMessages.append("server: " + message + "
"); etMessage.setText(""); } }); } } }
Step 4 − Add the following code to androidManifest.xml
<?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.example.myapplication"> <uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name = "android.permission.INTERNET"/> <application android:allowBackup = "true" android:icon = "@mipmap/ic_launcher" android:label = "@string/app_name" android:roundIcon = "@mipmap/ic_launcher_round" android:supportsRtl = "true" android:theme = "@style/AppTheme"> <activity android:name = ".MainActivity" android:label = "Server"> <intent-filter> <action android:name = "android.intent.action.MAIN" /> <category android:name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Client
Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project.
Step 2 − Add the following code to res/layout/activity_main.xml.
<?xml version = "1.0" encoding = "utf-8"?> <RelativeLayout 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:layout_margin = "16dp" tools:context = ".MainActivity"> <EditText android:id = "@+id/etIP" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "IP-Address" android:inputType = "text" /> <EditText android:id = "@+id/etPort" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_below = "@+id/etIP" android:hint = "Port No" android:inputType = "number" /> <Button android:id = "@+id/btnConnect" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_below = "@+id/etPort" android:layout_gravity = "center" android:layout_marginTop = "16dp" android:text = "Connect To Server" /> <TextView android:id = "@+id/tvMessages" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_above = "@+id/etMessage" android:layout_below = "@+id/btnConnect" android:inputType = "textMultiLine" android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" /> <EditText android:id = "@+id/etMessage" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_above = "@+id/btnSend" android:hint = "Enter Message" android:inputType = "text" /> <Button android:id = "@+id/btnSend" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_alignParentBottom = "true" android:text = "SEND" /> </RelativeLayout>
Step 3 − Add the following code to res/layout/MainActivity.java.
package com.client.myapplication.client; import android.annotation.SuppressLint; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; @SuppressLint("SetTextI18n") public class MainActivity extends AppCompatActivity { Thread Thread1 = null; EditText etIP, etPort; TextView tvMessages; EditText etMessage; Button btnSend; String SERVER_IP; int SERVER_PORT; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etIP = findViewById(R.id.etIP); etPort = findViewById(R.id.etPort); tvMessages = findViewById(R.id.tvMessages); etMessage = findViewById(R.id.etMessage); btnSend = findViewById(R.id.btnSend); Button btnConnect = findViewById(R.id.btnConnect); btnConnect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tvMessages.setText(""); SERVER_IP = etIP.getText().toString().trim(); SERVER_PORT = Integer.parseInt(etPort.getText().toString().trim()); Thread1 = new Thread(new Thread1()); Thread1.start(); } }); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String message = etMessage.getText().toString().trim(); if (!message.isEmpty()) { new Thread(new Thread3(message)).start(); } } }); } private PrintWriter output; private BufferedReader input; class Thread1 implements Runnable { @Override public void run() { Socket socket; try { socket = new Socket(SERVER_IP, SERVER_PORT); output = new PrintWriter(socket.getOutputStream()); input = new BufferedReader(new InputStreamReader(socket.getInputStream())); runOnUiThread(new Runnable() { @Override public void run() { tvMessages.setText("Connected
"); } }); new Thread(new Thread2()).start(); } catch (IOException e) { e.printStackTrace(); } } } class Thread2 implements Runnable { @Override public void run() { while (true) { try { final String message = input.readLine(); if (message ! = null) { runOnUiThread(new Runnable() { @Override public void run() { tvMessages.append("server: " + message + "
"); } }); } else { Thread1 = new Thread(new Thread1()); Thread1.start(); return; } } catch (IOException e) { e.printStackTrace(); } } } } class Thread3 implements Runnable { private String message; Thread3(String message) { this.message = message; } @Override public void run() { output.write(message); output.flush(); runOnUiThread(new Runnable() { @Override public void run() { tvMessages.append("client: " + message + "
"); etMessage.setText(""); } }); } } }
Step 4 − Add the following code to androidManifest.xml
<?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.client.myapplication.client"> <uses-permission android:name = "android.permission.INTERNET" /> <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup = "true" android:icon = "@mipmap/ic_launcher" android:label = "@string/app_name" android:roundIcon = "@mipmap/ic_launcher_round" android:supportsRtl = "true" android:theme = "@style/AppTheme"> <activity android:name = "com.client.myapplication.client.MainActivity" android:label = "Client"> <intent-filter> <action android:name = "android.intent.action.MAIN" /> <category android:name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Let's try to run your both server and client application. I assume you have connected your actual Android Mobile device with your computer. To run the app from android studio, open one of your project's activity files and click Run icon from the toolbar. Select your mobile device as an option and then check your mobile device which will display your default screen –
Server:-
Client:-
Server:-
Click here to download the project code
- Related Articles
- Client Server Computing
- Operating Systems Client/Server Communication
- MySQL Client Server-Side Help
- Difference between Client and Server
- XMLRPC server and client modules in Python
- Structure of a Client Server System
- What is a client-server system?
- What is Client-Server Architecture in Computer Network?
- Client-Server Diffie-Hellman Algorithm Implementation in Java
- Centralized and Client Server Architectures for DBMSs
- Client-Server Architecture - Everything You Should Know
- Difference between Client/Server and Distributed DBMS
- Reverse a string in C/C++ using Client Server model
- Installing SAP Sybase client on Windows server 2012 R2
- Difference between Client-Server and Peer-to-Peer Network
