VB.NETのソケット通信のサンプルです。
目次
サンプル | ソケット通信とは |
サンプルコードの説明 | |
サーバー側のコード | |
クライアント側のコード | |
実行して確認する |
ソケット通信とは
- ソケットは、OSに実装されている機能です。
- IPアドレスとポート番号を指定して通信します。
- サーバー側は待ち状態で起動します。
- クライアント側はサーバー側に接続しに行きます。
- サーバー側はクライアント側から要求を受けて処理をします。
サンプルコードの説明
サーバー側とクライアント側のコードがあります。
クライアント側で、
偶数の数値を入力するとサーバーは「OK」を返します。
奇数の数値を入力するとサーバーは「NG」を返します。
数値以外を入力するとメッセージを返します。
byeと入力するとサーバー側とクライアント側の処理が終了します。
コンソールアプリ(.NET Framework)で作成しました。
server1.vbがサーバー側でclient1.vbがクライアント側です。
https://github.com/ut23405/vbnet
サーバー側のコード
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Text.RegularExpressions
Module Module1
'ソケット通信(サーバー側)
Sub Main()
Dim host1 As IPAddress = IPAddress.Parse("127.0.0.1")
Dim port1 As Integer = 8765
Dim ipe1 As IPEndPoint = New IPEndPoint(host1, port1)
Dim server As TcpListener = Nothing
Dim recvline As String
Dim sendline As String = Nothing
Dim num As Integer
Dim outflg As Boolean = False
Dim buf(1024) As Byte
Dim reg As Regex = New Regex("\0")
Try
server = New TcpListener(ipe1)
Console.WriteLine("クライアントからの入力待ち状態")
server.Start()
While (True)
Using client = server.AcceptTcpClient()
Using stream = client.GetStream()
While stream.Read(buf, 0, buf.Length) <> 0
recvline = reg.Replace(Encoding.UTF8.GetString(buf), "")
Console.WriteLine("client側の入力文字=" + recvline)
If recvline = "bye" Then
outflg = True
Exit While
End If
Try
num = Integer.Parse(recvline)
If num Mod 2 = 0 Then
sendline = "OKです"
Else
sendline = "NGです"
End If
Catch ex As Exception
sendline = "数値を入力して下さい"
Finally
buf = Encoding.UTF8.GetBytes(sendline)
stream.Write(buf, 0, buf.Length)
Array.Clear(buf, 0, buf.Length)
End Try
End While
If (outflg = True) Then
Exit While
End If
End Using
End Using
End While
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
server.Stop()
Console.WriteLine("サーバー側終了です")
End Try
End Sub
End Module
11行目は、サーバーのIPアドレスとポート番号をセットしています。
17行目は、バイト配列のサイズを指定しています。
26行目は、クライアントから送信された文字列を受け取ります。bufにバイト配列でセットされます。
27行目は、クライアントから受け取ったデータの後にnull文字(0x00)が入るのでReplaceで削除しています。
29行目は、クライアントからbyeの文字列を受け取った時にループを終了します。
35行目からは、クライアントから受け取った数字を判定して文字列をセットしています。
43行目からは、セットした文字列をバイト配列にしてクライアント側に送信しています。
クライアント側のコード
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Text.RegularExpressions
Module client1
'ソケット通信(クライアント側)
Sub Main()
Dim host1 As IPAddress = IPAddress.Parse("127.0.0.1")
Dim port1 As Integer = 8765
Dim ipe1 As IPEndPoint = New IPEndPoint(host1, port1)
Dim line As String = Nothing
Dim buf1(1024) As Byte
Dim buf2(1024) As Byte
Dim reg As Regex = New Regex("\0")
Try
Using client = New TcpClient()
client.Connect(ipe1)
Using stream = client.GetStream()
While (line <> "bye")
' 標準入力からデータを取得
Console.WriteLine("--------------------------")
Console.WriteLine("偶数の数値を入力して下さい")
Console.WriteLine("--------------------------")
' サーバに送信
line = Console.ReadLine()
buf1 = Encoding.UTF8.GetBytes(line)
stream.Write(buf1, 0, buf1.Length)
' サーバから受信
stream.Read(buf2, 0, buf2.Length)
Console.WriteLine(
reg.Replace(Encoding.UTF8.GetString(buf2), ""))
End While
End Using
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
Console.WriteLine("クライアント側終了です")
End Try
End Sub
End Module
11行目は、サーバーのIPアドレスとポート番号をセットしています。
13,14行目は、バイト配列のサイズを指定しています。送信用と受信用の変数があります。
26行目は、コマンドプロンプトで入力した値を受け取ります。
27行目は、バイト配列にしています。
28行目は、サーバーに値を送信しています。buf1に値が入っています。
30行目は、サーバーからの値を受信します。buf2に値が入っています。
32行目は、サーバーから受け取ったデータの後にnull文字(0x00)が入るのでReplaceで削除しています。
実行して確認する
1.exeファイルを作成します。作成方法は以下を参照願います。
Visual Studio exeファイルを作成する方法
2.exeファイルを任意の場所に配置します。その後、コマンドプロンプトを2つ立ち上げ、先にサーバー側のcon11.exeを起動し、次にクライアント側のcon12.exeを起動します。
3.以下はサーバー側の実行結果です。
4.以下はクライアント側の実行結果です。
関連の記事