Android ソケットサーバーとソケットクライアントの簡易アプリを実装(サンプルソース公開)
こんにちはTF's apps(滋賀のアプリ開発者)です。なぜか年の瀬にAndroid でソケット通信プログラムを作成しています、ちょっと本業で使えると思いましたの勉強も兼ねて作ってみました、その時のソースコードを紹介します、興味のある方はぜひ参考の一つとして使用頂ければと思います。
■アプリの動作です
使い方は次の通りです。それぞれにアプリをインストールして、起動させた後、下記の手順に従い操作すると相互通信をスタートします。クライアント側は「テストメッセージ」を送信し、サーバー側は「私はサーバーです」を応答する、ただそれを繰り返すだけのシンプルな通信アプリです。
サーバー側
①ソケット「サーバー」のモードを選択
②「START」ボタンを押下
クライアント側
①ソケット「クライアント」のモードを選択
②サーバーのIPアドレスを入力(例:192.168.1.17)
③(事前にPINGボタンでサーバーとの導通確認を勧めます)
④「START」ボタンを押下
(1)動作環境
まずは今回構築したシステムの概要です、ごくごく一般的な環境で構築しています。この記事を読んでいる方は皆さん似たような環境だと思います。家庭用の無線ルーターを使用して、PC(Android Studio エミュレータ)とスマホに同じアプリをインストールさせてします、PC側をクライアント、スマホ側をサーバーにしています。注意点としてはスマホ側をサーバーにすることです、同じプログラムでPC側をサーバーにするとうまく通信できませんでした、理由としてはエミュレータ側のwindowサイズが0バイトとなってしまうためでした。エミュレータ側のwindowサイズを設定する方法がわからなかったので、調査するのを打ち切っています。なので、下記の構成の通り、スマホ側をサーバー、PC側をクライアントで使用ください。(もし、スマホ2台で使用するのなら全く問題ありません。どちらをサーバー、クライアントにするかは特に気にする必要がありません)
(2)ソケットクライアント
ソケットクライアントとして、MyClientというクラスを作成しています。そのメソッドとして、接続:Connect、切断:DisConnect、送信:SendMessage、受信:RecvMessageを用意しています。ポート番号は2002を使用しています。では実際のソースコードとなります。
package tfsapps.sockapp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class MyClient {
public String str_status = "";
private Socket cSocket = null;
private OutputStream writer = null; //書込み
private InputStream reader = null; //読込み
private String ipaddress = "192.168.1.17";
private int counter = 0;
public MyClient(String ipaddr) {
if(ipaddr.isEmpty() == false) {
ipaddress = ipaddr;
}
}
/*********************************
ソケット接続
*********************************/
public boolean Connect() {
str_status += "[1] 接続中\n";
InetSocketAddress _socket = new InetSocketAddress(ipaddress, 2002);
try {
cSocket = new Socket();
cSocket.connect(_socket, 1000);
}
catch (Exception e) {
e.printStackTrace();
return false;
}
str_status += "[2] 接続完了\n";
return true;
}
/*********************************
ソケット切断
*********************************/
public boolean DisConnect() {
try {
cSocket.close();
cSocket = null;
writer.close();
reader.close();
}
catch (Exception e) {
}
return true;
}
/*********************************
メッセージ送信
*********************************/
public boolean SendMessage(String temp) {
if (cSocket.isConnected() == false){
return false;
}
str_status = "[3] テキスト送信中です・・・\n";
// テキスト送信
try {
writer = cSocket.getOutputStream();
counter++;
String str = (temp + counter);
writer.write(str.getBytes("UTF-8"));
str_status += "送信>>>:"+str+"\n";
} catch (IOException e) {
return false;
}
return true;
}
/*********************************
メッセージ受信
*********************************/
public Boolean RecvMessage() {
String temp = "";
byte w[] = new byte[4048];
int size;
if (cSocket.isConnected() == false){
return false;
}
str_status += "[4] テキスト受信中です・・・\n";
// テキスト受信
try {
reader = cSocket.getInputStream();
size = reader.read(w);
if (size <= 0) {
return false;
}
else{
temp = new String(w, 0, size, "UTF-8");
}
str_status += "受信<<<:"+temp+"\n";
} catch (IOException e) {
return false;
}
return true;
}
}
(3)ソケットサーバー
次にソケットサーバーです、同じくMyServerというクラスを用意しています。そのメソッドとして、通信受付:Accept、切断:DisConnect、受信:RecvMessage、送信:SendMessageを作成しています。