0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Socket通信(Java)】初めてSocket通信を実務で実装した感想

Last updated at Posted at 2020-04-15

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.記事からの抜粋

LittleEndianSample.java
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());
    }
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?