Socket通信を初めて実務で実装する機会があったので、感想と使用技術をメモしておきます。過去に独習していた時には、ぴんとこなかったのですが、さすがにデータ仕様書をみて実装すると体感することができました。
##1. Socket通信概要
サーバー・ソケットとクライアント・ソケットの2種類あるようですが、今回は、クライアント・ソケットのみを使用しました。
感想は、JavaのSocket Apiがあるけれど、結局、バイトストリームのやり取りか・・・と言うものでした。
データ仕様書にも、「データA:xxxバイトから4バイト」みたいな記載でしたし。
下記記事群を参考にさせていただきました。
@Hyman1993さん
Java通信APIのまとめ(一)Socketの使い方
@Ginさん
TCPのストリーム通信の切れ目・区切りについて
##2. バイトオーダー
設計書に「データはリトルエンディアンで格納されている」との記載がありました。Socket通信初心者の私には何の事やらチンプンカンプンでした
@mikanbakoさんの記事を参考にさせていただきました。
ByteBufferの複製には、バイトオーダーの再設定が必要
#####2.1.ポイントは2点。
- 読み込みデータを処理する為には、データ仕様書規定のバイト配列毎に数値や文字列に変換する必要がある。
- データがリトルエンディアンであれば、ByteBufferクラスへの複製時にリトルエンディアンを指定する必要がある。
Ex. byteBuffer.order(ByteOrder.LITTLE_ENDIAN)
#####2.2.記事からの抜粋
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class LittleEndianSample {
public static final void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(Short.BYTES);
// リトルエンディアンの16ビット整数。下位バイトが0x11、上位バイトが0x22。
buffer.order(ByteOrder.LITTLE_ENDIAN)
.put((byte) 0x11)
.put((byte) 0x22)
.rewind();
System.out.printf("0x%x\n", buffer.getShort());
}
}