VisualBasicでもソケット通信-Socket編

|

TCP/IPのソケット通信と言ったら、C言語だろうとVisualBasicだろうとソケットを作成するのが基本。と言うか一般的ですよね。

マイクロソフトのドキュメントによれば、

If you are writing a relatively simple application and do not require maximum performance, consider using TcpClient, TcpListener, and UdpClient. These classes provide a simpler and more user-friendly interface to Socket communications.

だそうですから、VBでも尚更、Socketクラスを使わない訳には行きません(ホンマかいな?)。

<注意点>

・動作は同期ブロッキングモードです。

・Listenメソッドの引数は接続要求を保留する上限値を指定します。

・エラー処理は手抜きです。


お試し環境
  Windows7 64bit Edition
  Visual Basic 2008 AnyCPU対象


/*---- サーバー側 -------------------- お試し結果 --------------------------*/

Waiting for a connection...
Text received : This is a test<EOF>
Waiting for a connection...

/*----------------------------------------------------------------------------*/

/*---- クライアント側 ---------------- お試し結果 --------------------------*/

Socket connected to ::1:22000
Echoed test = This is a test<EOF>

/*----------------------------------------------------------------------------*/


/*---- サーバー側 ------------------  お試しソース -------------------------*/

'Imports System.Net
'Imports System.Net.Sockets
'Imports System.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim srvSkt As Net.Sockets.Socket ' サーバー側ソケット
        Dim datSkt As Net.Sockets.Socket ' クライアント側との送受信ソケット
        Dim port As Integer
        Dim rcvLen As Integer
        Dim sndBytes(1024) As Byte ' バイト列の送信バッファ
        Dim rcvBytes(1024) As Byte ' バイト列の受信バッファ
        Dim msg As String

        Dim ipHostInfo As Net.IPHostEntry
        Dim ipAddress As Net.IPAddress ' ローカルIPアドレス
        Dim localEP As Net.IPEndPoint

        port = 22000
        ipHostInfo = Net.Dns.GetHostEntry("localhost")
        ipAddress = ipHostInfo.AddressList(0)
        localEP = New Net.IPEndPoint(ipAddress, port)

        ' ソケット作成
        srvSkt = New Net.Sockets.Socket(ipAddress.AddressFamily, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)

        Try
            ' ソケットをローカルエンドポイントに関連付け
            srvSkt.Bind(localEP)
            ' クライアントからの接続要求をリッスン
            srvSkt.Listen(1)

            ' 接続要求受け取り開始
            While True
                Debug.Print("Waiting for a connection...")
                ' 接続要求許可待ちの間、プログラムは一時停止されます
                datSkt = srvSkt.Accept()
                msg = Nothing

                ' クライアントからデータ受信
                While True
                    rcvLen = datSkt.Receive(rcvBytes)
                    msg += System.Text.Encoding.ASCII.GetString(rcvBytes, 0, rcvLen)
                    If msg.IndexOf("<EOF>") > -1 Then
                        Exit While
                    End If
                End While
                ' 受信データを表示
                Debug.Print("Text received : {0}", msg)

                ' クライアントにデータをエコーバック
                sndBytes = System.Text.Encoding.ASCII.GetBytes(msg)
                datSkt.Send(sndBytes)

                ' ソケット解放
                datSkt.Shutdown(Net.Sockets.SocketShutdown.Both)
                datSkt.Close()
            End While

        Catch ex As ArgumentException
            Debug.Print("ArgumentException : {0}", ex.ToString())
        Catch ex As Net.Sockets.SocketException
            Debug.Print("SocketException : {0}", ex.ToString())
        Catch ex As ObjectDisposedException
            Debug.Print("ObjectDisposedException : {0}", ex.ToString())
        Catch ex As Security.SecurityException
            Debug.Print("SecurityException : {0}", ex.ToString())
        Catch ex As InvalidOperationException
            Debug.Print("InvalidOperationException : {0}", ex.ToString())
        Catch ex As Exception
            Debug.Print("Unexpected exception : {0}", ex.ToString())
        End Try

    End Sub

End Class

/*----------------------------------------------------------------------------*/

/*---- クライアント側 --------------  お試しソース -------------------------*/

'Imports System.Net
'Imports System.Net.Sockets
'Imports System.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim clntSkt As Net.Sockets.Socket ' クライアント側ソケット
        Dim port As Integer
        Dim sndLen As Integer
        Dim rcvLen As Integer
        Dim sndBytes(1024) As Byte ' バイト列の送信バッファ
        Dim rcvBytes(1024) As Byte ' バイト列の受信バッファ

        Dim ipHostInfo As Net.IPHostEntry
        Dim ipAddress As Net.IPAddress ' リモートIPアドレス
        Dim remoteEP As Net.IPEndPoint

        port = 22000
        ipHostInfo = Net.Dns.GetHostEntry("localhost")
        ipAddress = ipHostInfo.AddressList(0)
        remoteEP = New Net.IPEndPoint(ipAddress, port)

        ' ソケット作成
        clntSkt = New Net.Sockets.Socket(ipAddress.AddressFamily, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)

        Try
            ' ソケットをリモートエンドポイントに接続
            clntSkt.Connect(remoteEP)
            Debug.Print("Socket connected to {0}", clntSkt.RemoteEndPoint.ToString())

            ' 送信文字列をバイト配列に変換
            sndBytes = System.Text.Encoding.ASCII.GetBytes("This is a test<EOF>")

            ' データ送信
            sndLen = clntSkt.Send(sndBytes)

            ' リモートサーバーから応答受信
            rcvLen = clntSkt.Receive(rcvBytes)
            Debug.Print("Echoed test = {0}", System.Text.Encoding.ASCII.GetString(rcvBytes, 0, rcvLen))

            ' ソケット解放
            clntSkt.Shutdown(Net.Sockets.SocketShutdown.Both)
            clntSkt.Close()

        Catch ex As ArgumentException
            Debug.Print("ArgumentException : {0}", ex.ToString())
        Catch ex As Net.Sockets.SocketException
            Debug.Print("SocketException : {0}", ex.ToString())
        Catch ex As ObjectDisposedException
            Debug.Print("ObjectDisposedException : {0}", ex.ToString())
        Catch ex As Security.SecurityException
            Debug.Print("SecurityException : {0}", ex.ToString())
        Catch ex As InvalidOperationException
            Debug.Print("InvalidOperationException : {0}", ex.ToString())
        Catch ex As Exception
            Debug.Print("Unexpected exception : {0}", ex.ToString())
        End Try

    End Sub

End Class

/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/*============================================================================*/

このブログ記事について

このページは、微禄が2022年1月12日 17:25に書いたブログ記事です。

ひとつ前のブログ記事は「VisualBasicでもソケット通信(Tcp通信)、だけどその前に」です。

次のブログ記事は「VisualBasicでもソケット通信-TcpListener/TcpClient編」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

お気に入りリンク

NOP法人 アジアチャイルドサポート 最も大切なボランティアは、自分自身が一生懸命に生きること