BufferedWriterクラスを使用してサーバーにメッセージを送信する


Socketクラスを使用してソケット通信をするではサーバーへ接続してメッセージを受け取る方法を紹介しましたが、今回はサーバーへメッセージを送信する方法を紹介します。

詳細は以下から。

・BufferedWriterクラス

BufferedWriterクラスは文字型出力ストリームに効率的に文字を書き込む機能をサポートしてくれるクラスです。

以下のようにインスタンス化することでサーバーとの文字型出力ストリームを確立できます。

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
		"サーバーと接続が確立しているSocketクラスオブジェクト".getOutputStream()));

サーバーとの文字型出力ストリームが確立できたらwriteメソッドでストリームにメッセージを書き出し、flushメソッドでメッセージを送信します。

writer.write("サーバーへ送信するメッセージ");
writer.flush();

・パーミッションの追加

今回もサーバーと通信を行うので、Socketクラスを使用してソケット通信をするを参考にしてパーミッションにandroid.permission.INTERNETを追加して下さい。

・サンプルコード

今回のサンプルコードはSocketクラスを使用してソケット通信をするのコードにメソッドを追加する形で作成しています。

接続先は前回と同様にYahooメールサーバーになるので、サンプルの実行にはYahooメールアカウントが必要になります。

サンプルコードの全内容はこちらからSVNでダウンロード可能です。

public class SocketWriteSample extends Activity {

	Socket connection = null;
	BufferedReader reader = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button btn = (Button) findViewById(R.id.Button01);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				connect();
				login();
			}
		});
	}

	private void connect() {
		//前回と同内容の為、省略
	}

	private void login() {
		TextView tv = (TextView) findViewById(R.id.TextView01);

		// 入力されたIDを取得
		EditText id = (EditText) findViewById(R.id.EditText01);
		CharSequence idStr = id.getText();

		// 入力されたパスワードを取得
		EditText pass = (EditText) findViewById(R.id.EditText02);
		CharSequence passStr = pass.getText();

		BufferedWriter writer = null;
		try {
			// メッセージ送信オブジェクトのインスタンス化
			writer = new BufferedWriter(new OutputStreamWriter(
					connection.getOutputStream()));

			// ログインIDの送信
			writer.write(idStr.toString() + "\r\n");
			writer.flush();

			// ログインIDの正否判定
			String message = reader.readLine();
			if (!(message.matches("^\\+OK.*$"))) {
				tv.setText("ID認証:OK\r\n");
			} else {
				tv.setText("ログインIDが不正です。");
				return;
			}

			// ログインパスワードの送信
			writer.write(passStr.toString() + "\r\n");
			writer.flush();

			// ログインパスワードの正否判定
			message = reader.readLine();
			if (!(message.matches("^\\+OK.*$"))) {
				tv.append("パスワード認証:OK");
			} else {
				tv.setText("パスワードが不正です。");
				return;
			}
		} catch (IOException e) {
			e.printStackTrace();
			tv.setText("エラー内容:" + e.toString());
			Toast.makeText(this, "サーバーとの接続に失敗しました。",
                            Toast.LENGTH_SHORT).show();
		}finally{
			try {
				writer.close();
			} catch (IOException e) {
				e.printStackTrace();
				tv.setText("エラー内容:" + e.toString());
				Toast.makeText(this, "サーバーとの接続に失敗しました。",
                                    Toast.LENGTH_SHORT).show();
			}
		}
	}
}

30~36行目ではEditTextに入力されたIDとパスワードを文字列として取得しています。

41、42行目ではサーバーとの文字型出力ストリームを確立したBufferedWriterクラスオブジェクトをインスタンス化しています。

45、46行目と58、59行目では、writeメソッドとflushメソッドを使用して、サーバーにメッセージを送信しています。