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();
}
}
}
}
}
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>
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);
}
}
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();
}
});
}
}
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
Posting Komentar