2012.03.28

【Android SDK】HTTPサーバーの基礎を作る

ちょいと気になったので試しに作ってみる。

サンプル

大分乱雑なサンプル。

package jp.nyakki.HttpTest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

import android.util.Log;

public class TcpHttp extends Thread
{
	ServerSocket	m_sServer;
	Socket			m_sClient;
	
	@Override
	public void run()
	{
		try
		{
			SocketAddress	clientAddress;
			InputStream		in;
			OutputStream	out;
			
			//ソケット作成
			m_sServer = new ServerSocket( 12349 );
			
			Log.d( "nya", "開始");
			
			//クライアントからの接続を待ち受けるループ
			while (true)
			{
				// クライアントの接続を取得
				m_sClient = m_sServer.accept();
				clientAddress = m_sClient.getRemoteSocketAddress();
				Log.d( "nya", "接続中:" + clientAddress);
				
				in = m_sClient.getInputStream();
				out = m_sClient.getOutputStream();
				
				InputStreamReader	isr;
				BufferedReader		br;
				
				isr = new InputStreamReader( in );
				br = new BufferedReader( isr );
				
				//リクエスト取得
				while( true )
				{
					String szLine = br.readLine();
					
					//空行が着たら終了
					if( szLine.length() == 0 )
					{
						break;
					}
					
					Log.d( "nya", szLine );
				}
				
				//レスポンス返却
				OutputStreamWriter	osw;
				BufferedWriter		bw;
				
				osw = new OutputStreamWriter( out );
				bw = new BufferedWriter( osw );
				
				bw.write("HTTP/1.1 200 OK\r\n");
				bw.write("Content-Type: text/plain; charset=UTF-8\r\n");
				bw.write("\r\n");
				bw.write("あいうえお");
				bw.flush();
				
				//クライアントとの接続を切る
				m_sClient.close();
			}
		}
		catch( Exception e )
		{
			//エラー処理
			
			ByteArrayOutputStream	baos;
			PrintStream				ps;
			
			baos = new ByteArrayOutputStream();
			ps = new PrintStream( baos );
			
			e.printStackTrace(ps);
			
			Log.d("nya", new String( baos.toByteArray() ) );
		}
	}
}

こんなスレッドをアプリ上で実行しておけばいいらしい。
アプリが起動した状態でブラウザで "http://127.0.0.1:12349/" へアクセスすると表示されるはずです。

基本的にはJavaのTCP処理でHTTPっぽく裁いてあげればよいらしい。

ServerSocketのコンストラクタでポートを決定。
自分のスマホだと結構いろんなところでポートをすでに取られいるのかこのタイミングでエラーとなる。(80や12345とか)

感想

てか、HTTPの基礎ってこんなもんなのですね。
もう少し情報を整備すればApache(藁)も出来るんじゃないかと思ってしまいます。

基礎から学ぶ Android SDK 基礎から学ぶ Android SDK
吉井 博史

シーアンドアール研究所 2010-01-25
売り上げランキング : 159543

Amazonで詳しく見る by G-Tools

Pocket

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>