- PR -

Socketでの通信形式について

1
投稿者投稿内容
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-06-15 19:21
いつもお世話になります。
今、Socketの勉強をしていて、分からないことがあり
有知識者にご教授頂きたく質問させていただきます。

@通信時に
 データ長(int型:2バイト)+データ部(可変)
の書式でデータを送信したいと考えております。
この場合、
使用するデータの中身は、int型(2バイト)/ASCII(8バイト)/S-JIS(任意)の
組み合わせとなるのですが
送信するデータをそれぞれbyte配列に変換する必要性があると思うのですが
変換方法はどのような方法となるのでしょうか?
A又、それらのデータを結合する(int(2バイト) + S-JIS(任意))簡単な方法など
あるのでしょうか(単純にループ処理で組み合わせる?)

下記に実装コードを記載します。
Public sub Send()
tcpClient = New System.Net.Sockets.TcpClient
tcpClient.Connect("Localhost", 8000)

Dim networkStream As NetworkStream = tcpClient.GetStream()
Dim sendText As String = "test"

If networkStream.CanWrite And networkStream.CanRead Then

'実際にはここで通信フォーマットのデータを作成したいと考えています。
Dim sendBytes As Byte() = Encoding.ASCII.GetBytes(sendText)

networkStream.Write(sendBytes, 0, sendBytes.Length)

Dim bytes(tcpClient.ReceiveBufferSize) As Byte
networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
Dim returndata As String = Encoding.ASCII.GetString(bytes)
Else
If Not networkStream.CanRead Then
st.Text = ("Could not write data to data stream")
tcpClient.Close()
Else
If Not networkStream.CanWrite Then
tcpClient.Close()
End If
End If
End If
End Sub

よろしくおねがいします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-15 20:23
有知識者です。  ←昔使ったことがあるようなフレーズだな…
BitConverterクラスを使うといいかな。

ここら辺も参考になりますかね〜
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=11404&forum=7
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-15 20:47

コード:
        Dim bufdata As Byte()
        Dim bufhead As Byte()
        If TypeOf obj Is String Then
            bufdata = System.Text.Encoding.GetEncoding("Shift-JIS").GetBytes(obj)
        ElseIf TypeOf obj Is Integer Then
            BitConverter.GetBytes(obj)
            If BitConverter.IsLittleEndian Then Array.Reverse(bufdata)
        Else
            bufdata = New Byte() {}
        End If
        bufhead = BitConverter.GetBytes(CUShort(bufdata.Length))
        If BitConverter.IsLittleEndian Then Array.Reverse(bufhead)
        networkStream.Write(bufhead, 0, bufhead.Length)
        networkStream.Write(bufdata, 0, bufdata.Length)



こんな感じかな。
動くかわからないですが。

>変換方法はどのような方法となるのでしょうか?

文字列はEncoding.GetBytes。
数字はBitConverter使ってEndian を確認すること。

>又、それらのデータを結合する(int(2バイト) + S-JIS(任意))簡単な方法など
あるのでしょうか(単純にループ処理で組み合わせる?)

相当特殊な場合を除いて、
結合せずにNetworkStreamに2回送るべき。
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-06-16 09:08
さっそくのご回答ありがとうございます。
ご教授いただいた内容で確認したいとおもいます。
ありがとうございました。
1

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