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メソッドを使用して、サーバーにメッセージを送信しています。