2015.05.15
【Android SDK】TCPクライアントを作る
なかなか面倒。
まずは自分がはまったところをあげておく。
・通信スレッドを新規作成すること
まずは簡単にActivity.onCreateのときに通信をはさんで動作チェックしようかなと思ったら
即座に例外が発生しActivityでは通信できない。
なので通信用スレッドを新規に作成して、通信処理を書かないといけない。
TCPの通信サンプルとしてはこんな感じ。
package info.malrone.tcptest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import android.util.Log; public class TcpTest extends Thread { private String m_szIp = "192.168.0.65"; //アクセス先IP private int m_nPort = 12345; //アクセス先ポート @Override public void run() { try { //通信用ソケット作成 Socket socket = new Socket( m_szIp, m_nPort ); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); BufferedReader br = new BufferedReader( new InputStreamReader(in, "UTF-8") ); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(out, "UTF-8") ); //テキストを送る bw.write("Hello TCP\n"); //データを確定させて通信処理を起こさせる bw.flush(); //相手からのデータ待ち String szData = br.readLine(); //表示する Log.d( "nya", "受信文字列:" + szData ); //後処理 in.close(); out.close(); socket.close(); } catch( Exception e ) { e.printStackTrace(); } } }
見てもらえばわかるのだが、一切Androidの機能を使わずJavaの機能だけで実装しています。
使っているのはデバッグ出力くらいかな。
なので詳しく機能を知りたい人はJavaの通信機能を調べるとよい。
今回は以前に書いたTCPサーバーに接続する感じで作っている。
Link:【Ruby】TCPサーバーを作る - ニャッキ格闘列伝
なのでテキストベースになるのでBufferedReaderとWriter経由してデータを取得している。
バイナリメインであればそのままStream経由でいいと思います。
Stream関係はバッファリングをしていることがよくあるので
即座に確定させたいときにはflush()を呼び出さないと通信処理などの
処理が起きないので注意です。
あとはActivityでスレッドを起動すればよい。
TcpTest tt = new TcpTest(); tt.start();
通信処理なので、AndroidManifest.xmlに通信許可もしておく。
<uses-permission android:name="android.permission.INTERNET"/>
もちろん、事前にTCPサーバーは立ち上げておかないといけない。
これでサーバーとの通信はできるようになりました。
しかし、Androidだとこれからの流れが大変だったりします。
[aws asin="4274064867"]
関連記事