質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

4681閲覧

ソケット通信で、全銀TCPの通信を行う方法につきまして(クライアント側)

Mozart

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/08/07 05:14

編集2019/08/07 06:37

現在、全銀協プロトコルという仕組みを勉強しております。

https://www.zenginkyo.or.jp/fileadmin/res/abstract/efforts/system/jba_protocol.pdf

現在、こちらの、42ページに表示されています。
基本シーケンスの通信開始時のコネクションを作ろうとしております。(クライアント側です)

全銀プロトコルでは、
通信開始時に、『サブレイヤヘッダ』と呼ばれるヘッダーと、中身の『テキスト』をセットで送信するようでございます。

このサブレイヤヘッダの構造は、36ページに記載されているのですが、
理解できない部分が多く困っております。

ヘッダの中身は8バイトの固定長で、
1.メッセージ長(2バイト)
2.版番号(4ビット)
3.識別子(4ビット)
4.予備(5バイト)

と記載されています。

現在、javaで、DataOutputStreamのwriteBytes()を使用して、
String形式のデータを送信するように作っていますが、
そもそも、このプロトコルの形式を、どのようなテキストに変換して送信すればよいかで躓いております。

まず、
メッセージ長は、86ページの通信制御電文=64バイトと記載されているので、
その中身を作り、上記のサブレイヤヘッダの後ろにつけて送信する…という大枠のイメージを持っております。

メッセージ長=64バイト+8バイト=72バイトを、
単純に
String message = '64';
とするのは間違いなのではないかと思うのですが、正解が見えません。

もし、全銀TCPなどのプロトコルを知っている方がいらっしゃいましたら、
教えていただけますと幸いです。

※追記

java

1 2Socket socket = new Socket("xxx.xxx.xxx.xxx", xxx); 3DataOutputStream os = new DataOutputStream(socket.getOutputStream()); 4BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "sjis")); 5StringBuilder strbil = new StringBuilder(); 6strbil.append(<こちらに伝送データを追加>); 7os.writeBytes(strbil.toString()); 8 9---- 以降は、返信をbrで読み込み予定 ---- 10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/08/07 05:59

何がわからないのかよくわからないので、質問文を編集して、理解している範囲でコードを書いてください。
Mozart

2019/08/07 06:38

質問が粗くてすみません。 今、作成しているコードの一部を記載いたしました。
otn

2019/08/07 07:55

プロトコル部分は手つかずと言う事ですね。 回答がついたのでそちらにお任せします。
Mozart

2019/08/07 08:15

ご返信ありがとうございます。 tacsheavenさんに教えていただいた方法で、チャレンジいたします。
guest

回答1

0

ベストアンサー

サプレイヤの部分はバイナリデータとして扱います。
また、「テキスト」は実際には伝聞制御レベルにおける伝送の単位なので、これもバイナリです(ただし伝聞の種別によって構造が異なる)。

なので基本的にはバイナリ(byte のストリーム)に落とし込んでください。

サプレイヤヘッダ先頭の2バイトには、サプレイヤヘッダ+テキスト全体、すなわち送信するデータ全体の長さを、2バイトの数値として(Java でいうところの short で)、確かネットワークバイトオーダ(ビッグエンディアン)で格納する必要があります。
※Java VM はビックエンディアンで処理しているので問題ないはずです

データ長が 8 + 64 の 72 バイトだとすれば、サプレイヤヘッダ先頭には 72 = 0x0048 なので、 00 48 と入る、ということです。

投稿2019/08/07 06:18

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mozart

2019/08/07 07:07

ご返信ありがとうございます! すべてbyteストリームにして送信するのですね。 こちら、ByteBuffer クラスに、 bb.put(0x0048); とセットしても大丈夫でしょうか。 また、その後に続く「4ビットのデータ」も理解ができておりません。 こちら、0001 と 0000 を入れるようなのですが、 どのようにバイト化すればよいでしょうか。 質問ばかりですみませんが、よろしくお願いいたします。
tacsheaven

2019/08/07 07:23

bb.putShort(72); でいいはずですよ。 又続くデータは「Ⅰバイトの上下4ビットを別々の意味で使っている」ので、二つの値から一つのbyte値を構築して、それをputByte() すればよいですね。 ※ただし版番号は 0001 に固定されていますから、実際には 0x10 (情報)か 0x11(制御)のどちらかの値にしかならない
tacsheaven

2019/08/07 07:31

一度電文のデータを構築(ByteBufferに)したら、それをファイルに書き出して、そのファイルをバイナリダンプしてみるなどして確認してみるとよいでしょう。
Mozart

2019/08/07 08:14

ご返信ありがとうございます! bb.putShort()で同じことができるのですね。 ありがとうございます! 版番号と識別子の各4ビットにつきましても、ありがとうございます。 教えていただいたとおり、 ByteBufferに格納したあと、ファイルに書き出して確認してみます!
Mozart

2019/08/08 00:00

すみません。 もうひとつ教えていただきたいことが発生しましたので、追加でご質問させてください。 メッセージ長は、16進数に変換して 72 = 0x0048 と教えていただきましたが、 センターの番号(10桁+4桁)など、他の数字の場所は、 そのまま0xを先頭につけて送信してしまう方向で大丈夫でしょうか。
tacsheaven

2019/08/08 00:16

実質的には(足りない分の桁埋めを考慮していれば)同じになりますが、ちゃんとデータ項目の内容に書かれた桁数指定に従って変換するように書きましょう。でないとあとで「なぜこれ 0x 付けてるんだろ?」となりますよ。
Mozart

2019/08/08 00:36

ありがとうございます。 仰るとおり、桁数を意識したいのですが、桁数とバイト数の考え方の差につきまして理解が及んでおらず、 頭が整理できておりません。 ところで、 byteに格納するときに、10進数(=72)を、16進数(=48)に変換して、 「0x0048」とするのは、仕様でヘキサデシマルにすると記載されている以外には、 理由はありますでしょうか。
tacsheaven

2019/08/08 00:46

データ項目の内容の桁数定義で、 X(n) となっているのはヘキサデシマル(2進化10進数)で、 B(n) となっているのはバイナリ(16進数でそのまま記録)です。 72 の場合、 X(2) なら 00 72 に( = int を string に変換して、桁数が足りない分は前に '0' を付け、さらに '0x' を先頭に付けたものを数値に再変換して格納する) B(2) なら 00 48 に( = int をそのまま突っ込む) なります。
Mozart

2019/08/08 03:01

ありがとうございます。 ヘキサデシマルは2進化10進数のことを指すのですね。 2進化10進数、勉強いたします。 教えていただいた内容がとてもわかりやすく、 このたびの使い方につきましては、理解することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問