VB.NET ソケット通信のサンプル

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.以下はクライアント側の実行結果です。

関連の記事

VB.NET Replace 文字列を置き換えるサンプル

△上に戻る