- PR -

VB.NETでSocket通信

1
投稿者投稿内容
Mikio
会議室デビュー日: 2005/09/05
投稿数: 2
お住まい・勤務地: NAGANO
投稿日時: 2005-09-05 17:52
はじめまして。さっそくですが質問があります。

VB.NETでソケット通信クライアントシステムを構築しているのですが、そこで問題が発生しております。
本来はシーケンサとソケット通信を行うのですが、テストのために同じくVB.NETでサーバをつくりました。

クライアント側:
コード:
sresponseByte(23) :Byte型
(192,9,200,48,0,9,0,65,0,0,0,0,1,13,32,5,9,5,23,38,2,30,144,0)

Dim sockClient As New System.Net.Sockets.TcpClient("サーバ名”,”ポート”)
Dim sockStream As System.Net.Sockets.NetworkStream = sockClient.GetStream()
sockStream.Write(sresponseByte, 0, sresponseByte.Length)



サーバ側:
コード:
Dim tcpListener As New TcpListener(nPortNumber)
tcpListener.Start()

Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
Dim networkStream As NetworkStream = tcpClient.GetStream()
Dim strReader As New System.IO.StreamReader(networkStream)

Dim Res() As Byte
Res = System.Text.Encoding.ASCII.GetBytes(strReader.ReadLine())


この結果、サーバ側でデータResの値が(9,48,0,9,0,65,0,0,0,0)のみの受信になってしまいます。

このように送信データと受信データに差異が発生しており困っております。
どのような理由で、こういう差異が発生するのかご教示いただけないでしょうか。

宜しくお願いいたします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-09-05 18:11
バイナリデータをStreamReaderで受信しないでください。
指定したエンコーディングで処理できないバイトは切り捨てられたり勝手に他の文字に変換されたりします。
//更に言えば、StreamReaderの既定のエンコーディングはUTF-8です。

バイナリデータを扱うのはBinaryReaderクラスです。
Mikio
会議室デビュー日: 2005/09/05
投稿数: 2
お住まい・勤務地: NAGANO
投稿日時: 2005-09-06 22:18
Hongliangさん、アドバイスありがとうございました。
早速BinaryWriterおよびBinaryReaderを利用することにしました。

そこで新たに2点の質問が発生しました。

・BinaryReaderクラスでサーバ側からバイナリデータを受信する場合、受信するサイズはどのように取得するのでしょうか。
BinaryReaderクラスのReadByteを利用しているのですが、読み取るバイト数をどのように取得できるかがわかりません。

・サーバ側から16バイトのバイナリデータを送信してもらい、ReadByte(16)で取得してみたのですが、16バイト目のデータが正常に取得できません。
たとえば、、16バイト目が"AA"なら"0A"と、"99"なら"09"と・・・先頭4バイトが落ちてしまってるような形になってしまいます。
これにも使い方に原因があるのでしょうか。

申し訳ございませんが、再度ご教示のほどよろしくお願いいたします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-09-07 00:11
引用:

BUZZさんの書き込み (2005-09-06 22:18) より:
・BinaryReaderクラスでサーバ側からバイナリデータを受信する場合、受信するサイズはどのように取得するのでしょうか。
BinaryReaderクラスのReadByteを利用しているのですが、読み取るバイト数をどのように取得できるかがわかりません。


TCPにそんな仕組みはありません。したがって読み取るべきデータサイズを固定長にするか、データサイズもTCPで送信する(例:HTTP1.1)か、あるいはデータ終端が分かるようにデリミタを決める(例OP3)か、データ終端で接続を閉じる(例:HTTP1.0)ようにします。

引用:

・サーバ側から16バイトのバイナリデータを送信してもらい、ReadByte(16)で取得してみたのですが、16バイト目のデータが正常に取得できません。
たとえば、、16バイト目が"AA"なら"0A"と、"99"なら"09"と・・・先頭4バイトが落ちてしまってるような形になってしまいます。


#それは4バイトではなく、4ビットでは・・・
TCP/IPではデータを1オクテット(8bit)単位で扱うので4bitだけ取れないという状況は創造できません。おそらくコーディングを間違えているのでしょう。

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/

[ メッセージ編集済み 編集者: 甕星 編集日時 2005-09-07 00:12 ]
1

スキルアップ/キャリアアップ(JOB@IT)