Java Network Socket〜極小サーバー〜

イントロダクション

ラズパイでは画面表示をCUI上では、行えなかったので画面無しのアプリ作成に変更してやります。

何をやるのか?

極小サイズのサーバー、ソケットサーバーを作りラズパイ と通信して、Lチカをやります。

設計

まず、アプリの設計を行います。

アプリの実行モデルは以下の通り

    1.ラズパイでソケットサーバーを立てる
    2.パソコンでソケット通信を行いラズパイに文字列を送る
    3.受け取った文字列により、コマンドを実行しLチカをする
    こんな感じで動くアプリをイメージしてます。
    1. <必要なクラス一覧>

 

    こんな感じで実装しようと思います。
    <必要なクラス>
  1. サーバーソケット
  2. クライアントソケット

サーバー・ソケットクラス

サーバーソケットはその名前の通り、作成した時に使用するIPとポート番号でSocketでの接続を待機します。Httpで接続することが多いですが、HttpConnectionと混同するとややこしいことになります(接続自体は可能です)。Socketでの通信はSocketを使用して、データの通信を行うのでHttpConnectionで接続するとレスポンスの形が違うと思うので(詳細の確認はできませんでした)うまく起動しません。起動しないこと自体は確認しました。(CHaserServer)で確認)。

サーバーソケットの実装サンプル(Gitにアップしています)

<ServerSocket作成>

isExe = true;
try {
	System.out.println("*** Start ***");
	socket = new ServerSocket();
	// タイムアウト3秒
	socket.setSoTimeout(3000);
	socket.bind(new InetSocketAddress("127.0.0.1",  8080));
	System.out.println("isBound: " + socket.isBound());
	System.out.println("LocalPort: " + socket.getLocalPort());
	socket.setSoTimeout(5000);
} catch(IOException ie) {
	ie.printStackTrace();
}

<接続を待機する>

public void sartServer() throws IOException, InterruptedException{
	System.out.println("Accept: ");
	Socket recieve = socket.accept();
	recieve.connect(new InetSocketAddress("127.0.0.1",  8080));
	BufferedReader in = null;
	while(isExe) {
		System.out.println("Hello Socket: ");
		in = new BufferedReader(new InputStreamReader(recieve.getInputStream()));
		System.out.println("Recieve: " + in.readLine());
		Thread.sleep(500L);
	}
	in.close();
	in = null;
}

こんな感じで接続後(bind())に、受付を待機(accept())する処理を行いクライアントのアクセスを待ちます。

クライアント・ソケットクラス

ソケットを開いてサーバーに接続します。

public static void main(String[] args) {
	String serverHost = "127.0.0.1";
	int portNo = 2009; // COOLを使用する
	// CHaserServerへの接続作成及びゲーム起動
	U16ProconClient client = new U16ProconClient(serverHost, portNo);

	// サーバーへ接続する(GetReady送信)
	client.connectChaser();
}

そして、開いたソケットでデータを送信(InputStream)と受信

try {
	System.out.println("*** Send Socket ***");
	OutputStream sendTo = socket.getOutputStream();
	sendTo.write(sendHttpRequest.getBytes());
	// CHaserServerにアクセスする
	System.out.println("isConnected: "+ socket.isConnected());
	System.out.println("isOutputShutdown: "+ socket.isOutputShutdown());
	BufferedReader res = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	String line = null;
	while((line = res.readLine()) != null) {
		System.out.println(line);
	}

	sendTo.close();
	res.close();
} catch (IOException e) {
	e.printStackTrace();
}

本当にサンプル、接続はしたけどCHaserServerへのアクセスご何もしないで切断してしまいます。(タイムアウトです)

とりあえずはSocketのクライアントとしてはこの様な形で実装します。

 

でわでわ。。。

 


投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す