Aplikasi Server

Aplikasi server yg kita buat akan menggunakan port 8888. Adapun alamat IP yg digunakan server merupakan alamat IP komputer di mana server dijalankan. Anda dapat menjalankan ipconfig di command prompt (jika Anda menggunakan Windows) untuk mengecek IP komputer Anda.

File: PanggilSayaServer.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
class PanggilSayaServer {
 
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            System.out.println("PanggilSayaServer sedang berjalan, menunggu request dari client.");
            // Server dijalankan menggunakan port 8888
            serverSocket = new ServerSocket(8888);
            while (true) {
                // Menerima request dari client. Gunakan socket baru untuk menangani request dari client
                Socket socket = serverSocket.accept();
 
                // Membaca stream input dari client
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                String input = dataInputStream.readUTF();
 
                // Membuat stream output untuk memberikan respon kepada client
                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                String output = "Halo, " + input + "!";
                dataOutputStream.writeUTF(output);
                dataOutputStream.flush();
                dataOutputStream.close();
                System.out.println("Nama client: " + input);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IOException: " + e.toString());
        } finally {
            // Menghentikan server
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
Java
Mari kita compile dan jalankan kode di atas.
> javac PanggilSayaServer.java
> java PanggilSayaServer
  PanggilSayaServer sedang berjalan, menunggu request dari client.
Untuk menghentikan server, gunakan 

Aplikasi Client

Mari kita buat sebuah project Android baru dengan nama Panggil Saya. Saya menggunakan Android Studio 2.2 dan Java 1.8. Untuk nama package aplikasi, saya menggunakan com.mikhsan.practice.panggilsaya. Minimum SDK saya set API 16: Android 4.1 (Jelly Bean). Hal-hal tersebut, seperti nama aplikasi, bukanlah merupakan suatu ketentuan, silahkan dirubah sesuai keinginan Anda. Namun, jika Anda menggunakan nama package yg berbeda, pastikan Anda juga menyesuaikannya pada kode yg akan kita buat. Mari kita buat tampilan antarmukanya terlebih dahulu.

File: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    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="com.mikhsan.practice.panggilsaya.MainActivity">
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
 
        <EditText
            android:id="@+id/textIpAddress"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="5"
            android:inputType="textUri"
            android:hint="Alamat IP Server" />
 
        <EditText
            android:id="@+id/textPort"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="5"
            android:inputType="number"
            android:hint="Port" />
    </LinearLayout>
 
    <EditText
        android:id="@+id/textRequest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:hint="Nama Saya" />
 
    <Button
        android:id="@+id/buttonSend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Panggil Saya!" />
 
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp">
 
        <TextView
            android:id="@+id/textResponse"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Respon dari server"
            android:text="" />
    </ScrollView>
</LinearLayout>
Markup
Untuk menangani masalah pembuatan request ke server dan menerima respon dari server, yg kemudian menampilkan respon tersebut, kita akan membuat sebuah kelas baru dengan nama Communication.

File: Communication.java

package com.mikhsan.practice.panggilsaya;
 
import android.os.AsyncTask;
import android.widget.TextView;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class Communication extends AsyncTask<Void, Void, Void> {
 
    String destAddress;
    int destPort;
    TextView textViewResponse;
    String textRequest;
    String message = "";
 
    public Communication(String destAddress, int destPort, String textRequest, TextView textViewResponse) {
        this.destAddress = destAddress;
        this.destPort = destPort;
        this.textRequest = textRequest;
        this.textViewResponse = textViewResponse;
    }
 
    @Override
    protected Void doInBackground(Void... voids) {
        Socket socket = null;
 
        try {
            socket = new Socket(destAddress, destPort);
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataOutputStream.writeUTF(textRequest);
            dataOutputStream.flush();
 
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
            message = dataInputStream.readUTF();
            dataInputStream.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            message = "UnknownHostException: " + e.toString() + "\r\n";
        } catch (IOException e) {
            e.printStackTrace();
            message = "IOException: " + e.toString() + "\r\n";
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
        return null;
    }
 
    @Override
    protected void onPostExecute (Void result) {
        String existingMessage = textViewResponse.getText().toString();
        message = existingMessage + message + "\n";
        textViewResponse.setText(message);
        super.onPostExecute(result);
    }
}
Java
Selanjutnya, kita akan menginisialisasi objek Communication setiap kali tombol Panggil Saya! dan memulai komunikasi dengan server. Kode tersebut akan kita tambahkan ke file MainActivity.java.

File: MainActivity.java

package com.mikhsan.practice.panggilsaya;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        ((Button) findViewById(R.id.buttonSend)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String destAddress = ((EditText) findViewById(R.id.textIpAddress)).getText().toString();
                int destPort = Integer.parseInt(((EditText) findViewById(R.id.textPort)).getText().toString());
                String textRequest = ((EditText) findViewById(R.id.textRequest)).getText().toString();
                TextView textViewResponse = (TextView) findViewById(R.id.textResponse);
 
                Communication communication = new Communication(destAddress, destPort, textRequest, textViewResponse);
                communication.execute();
            }
        });
    }
}
Java
Dan yang terakhir, karena kita melakukan komunikasi jaringan, maka kita perlu menambahkan sebuah uses-permission tag ke file AndroidManifest.xml.

File: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mikhsan.practice.panggilsaya">
 
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

Komentar