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
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*============================================================================*/