イントロダクション
ラズパイでは画面表示をCUI上では、行えなかったので画面無しのアプリ作成に変更してやります。
何をやるのか?
極小サイズのサーバー、ソケットサーバーを作りラズパイ と通信して、Lチカをやります。
設計
まず、アプリの設計を行います。
アプリの実行モデルは以下の通り
- 1.ラズパイでソケットサーバーを立てる
- 2.パソコンでソケット通信を行いラズパイに文字列を送る
- 3.受け取った文字列により、コマンドを実行しLチカをする
- こんな感じで動くアプリをイメージしてます。
-
- <必要なクラス一覧>
- こんな感じで実装しようと思います。
- <必要なクラス>
サーバー・ソケットクラス
サーバーソケットはその名前の通り、作成した時に使用する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のクライアントとしてはこの様な形で実装します。
でわでわ。。。