m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

nodejsのsocket.ioのサーバにJavaで作成したクライアントで接続する

ソケット通信のサンプルって

基本TCP/IP関連のやつなんですね。
まあ、わかりますけど、websocketとか使う際はどんなデータが流れてくるとかどんな手法で送信したらよいとかちょっとわかりづらい事があります。

今回はJavaでsocket.ioのサンプルを探して見ました。

簡単なやつですけど助かりました。

実装

サーバ側
var io = require('socket.io').listen(3000);

// 接続
io.sockets.on("connect", function(socket) {
    console.log("connected");

    // 接続後にクライアントへ送信する
    socket.emit("message", "接続OKです。");

    // 切断
    socket.on("disconnect", function(data) {
        console.log(data);
        console.log("disconnected");
    });

    // メッセージ受信
    socket.on("message", function(data) {
        console.log("送信:" + data);
    });

});
クライアント側
package socket_sample01;

import java.net.URISyntaxException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;

public class Sample01 {
	
	private static Socket socket;
	
	public static void main(String[] args) throws URISyntaxException, InterruptedException {
		socket = IO.socket("http://localhost:3000");

        // サーバーからのmessageがemitされた時
        socket.on("message", new Emitter.Listener() {
            public void call(Object... objects) {
                // 最初の引数を表示
                System.out.println(objects[0]);
                //サーバー側にmessageで送信
                socket.emit("message", "This is Java");
            }
        });
        
        // 接続開始
        socket.connect();
        
        // タイマーようのタスク
        class SampleTask extends TimerTask {

        	/** このメソッドがTimerから呼ばれる */
        	@Override
        	public void run() {
        		System.out.println("タスク実行:" + new Date());
        		
        		// 切断処理
        		socket.disconnect();
        	}
        }
        
        // 一定時間後に処理を切断するように指示
        TimerTask task = new SampleTask();
        Timer timer = new Timer("myTimer");
        System.out.println("処理開始:" + new Date());
        timer.schedule(task, TimeUnit.SECONDS.toMillis(3)); //3秒遅延させる
        TimeUnit.SECONDS.sleep(5);
        timer.cancel();
        System.out.println("処理終了");

	}

}

クライアントのライブラリ

  <dependencies>
    <dependency>
      <groupId>io.socket</groupId>
      <artifactId>socket.io-client</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>

所感

簡単な接続自体はできた。
単純なメッセージではなく、配列とかクラスのようなデータの場合はどのような設定で送信すればよいのかちょっと調べてみよう。