VB.netでソケット通信する方法は?ソケット通信の概要やサンプルプログラムをご紹介
- システム
エンジニア - 今では当たり前になってきたソケット通信について教えてください。
- プロジェクト
マネージャー - 世界中の方がデータ通信を利用していますね。では基本からおさらいしていきましょう。
ソケット通信とは?
ソケットはアプリケーション同士でデータ通信する際の出入り口のことを指します。通信する各アプリケーションの出入り口にはIPアドレスとポート番号が割り振られていて、このIPアドレスとポート番号を利用した通信をソケット通信と言います。
一つのネットワーク内には、同じIPアドレスとポート番号の組み合わせが無いように割り振るルールになっているので、通信するアプリケーションがネットワーク内に複数あった場合でも、相手を間違えずに通信することができます。
クライアントサーバシステムとは?
例えば、パソコンでブラウザを立ち上げてホームページを閲覧する場合、ソケット通信が行われています。この場合、パソコン側を「クライアント」、ホームページが保存されているインターネット上のコンピュータ側を「サーバ」と呼んでいます。
「クライアント」はサービスを受け取る側、「サーバ」はサービスを提供する側と言い換えることができます。このようにコンピュータをクライアント側、サーバ側に分けて役割分担する仕組みを、クライアントサーバシステムと言います。
ソケット通信で使うプロトコルとは?
ソケット通信では、TCP/IPまたは、UDP/IPのどちらかの通信プロトコルを使用します。通信プロトコルとは、データ通信する際の決められたルールや手順のことです。
日本国内だけでなく、海外のホームページを閲覧できたり、Windows PCとMac PCでメールをやり取りできたりするのは、共通の通信プロトコルが取り決められているためです。
TCP/IPとは?
TCPはTransmission Control Protocolの略です。ソケット通信の1つであるTCP/IPはインターネットで標準的に利用されているプロトコルで、ホームページの閲覧やファイル転送時などに用いられています。信頼性の高い通信を行うことができます。
コネクション型通信とも呼ばれ、通信開始前に相手との間で仮想的な通信路を確保したり、相手からの受信確認をチェックして届いていない場合は再送するなど、通信の信頼性を高める仕組みがあります。その代わり、通信に時間がかかるという難点もあります。
UDP/IPとは?
UDPはUser Datagram Protocolの略です。ソケット通信の1つであるUDP/IPもインターネットで標準的に利用されているプロトコルで、DNS(ドメイン名とIPアドレスの紐づけ)やNTP(各機器の時刻同期)などに用いられています。TCP/IPと比べると信頼性の面で劣りますが、高速性やリアルタイム性が優れています。
コネクションレス型通信とも呼ばれ、通信開始前に相手との間で事前のやり取りや再送処理などをしないため、高速性やリアルタイム性がある反面、信頼性が低いという難点があります。
TCP/IPとUDP/IPの比較
TCP/IPとUDP/IPはそれぞれ特徴が異なるため、用途に応じて使い分けされています。
TCP/IPは信頼性は高く通信データが届かなかった場合でも再送するため、時間が掛かっても確実に通信相手にデータを届けたい場合に使用します。一方、UCP/IPは高速性やリアルタイム性が高いので、早くデータを届けたい場合に使用します。
下表ではTCP/IPとUDP/IPの特徴を比較しています。
プロトコル | TCP/IP | UDP/IP |
---|---|---|
通信方式 | コネクション型通信 | コネクションレス型通信 |
信頼性 | 高い | 低い |
転送速度 | 遅い | 速い |
上位プロトコル | HTTP、Telnet、FTPなど | DNS、NTP、DHCPなど |
用途 | ホームページの閲覧、メール送受信、ファイル転送など | 少量のデータ転送、ブロードキャスト、マルチキャスト、Videoストリーミングなど |
特徴 | 通信相手とのコネクションを確立,信頼性が高い,データ欠落時の再送あり | コネクションなし,高速,レスポンス速い,データ欠落しても再送なし |
VB.netとは?
VB.netを使用すれば簡単にソケット通信プログラムを作成することができます。VB.netとは、Microsoftが開発したプログラミング言語で、画面を作りながらプログラミングをすることができるので初めてでも学びやすい言語です。
VB.netはMicrosoftのホームページから無料でダウンロードすることができます。解説しているホームページもたくさんあるので、分からないことがあっても検索すれば容易に解決策を知ることができます。以降にVB.netでソケット通信するサンプルプログラムを紹介します。
VB.netプログラムの設定方法
ここでは、VB.netを使用してソケット通信のプログラミングをする方法を説明します。
TCP/IPでは、クライアント側とサーバ側で処理が異なるため、別々のプログラムを作成する必要があります。クライアント側はTcpClientクラスを使用し、サーバ側はTcpListenerクラスを使用します。
サーバ側は基本的に受信待ち状態で待機しておき、クライアント側からの要求が来たら処理を行うような動作です。
TCP/IPサーバ側のサンプルプログラム
VB.netでTCP/IPソケット通信するサーバ側のサンプルプログラムです。サンプルプログラムは大きく分けると次のような処理を行っています。
1. 起動時の接続設定(FormTcpSv_Load処理)
2. 終了時の切断設定(FormTcpSv_FormClosed処理)
3. クライアント接続待ち(ServerThread処理)
4. クライアントとの送受信(ClientTcpIpクラス)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
'====================================================
' TCP/IPソケット通信 サーバ側
'====================================================
Imports System.Threading
Imports System.Net
Public Class FormTcpSv
' TCPリスナー
Private tcpSvLis As Sockets.TcpListener
' クライアント
Private tcpClient As ClientTcpIp() = New ClientTcpIp(3) {}
'---------------------------
' 1. 起動時の接続設定
'---------------------------
Private Sub FormTcpSv_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
' IPアドレス&ポートNoセット
Dim myPort As Integer = 8888
Dim myEndPoint As New IPEndPoint(IPAddress.Any, myPort)
' TCPリスナー開始
tcpSvLis = New Sockets.TcpListener(myEndPoint)
tcpSvLis.Start()
' クライアント接続待ち開始
Dim myServerThread As New Thread(New ThreadStart(AddressOf ServerThread))
myServerThread.Start()
End Sub
'---------------------------
' 2. 終了時の切断設定
'---------------------------
Private Sub FormTcpSv_FormClosed( _
ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) _
Handles Me.FormClosed
' リスナー終了
tcpSvLis.Stop()
' クライアント切断
For i As Integer = 0 To tcpClient.GetLength(0) - 1
If tcpClient(i) Is Nothing = False AndAlso _
tcpClient(i).objSck.Connected = True Then
' ソケットクローズ
tcpClient(i).objStm.Close()
tcpClient(i).objSck.Close()
End If
Next
End Sub
'---------------------------
' 3. クライアント接続待ち
'---------------------------
Private Sub ServerThread()
Try
Dim no As Integer
While True
' ソケットの接続待ち
Dim tcpClient As Sockets.TcpClient = tcpSvLis.AcceptTcpClient()
' クライアントから接続あり
For no = 0 To tcpClient.GetLength(0) - 1
If tcpClient(no) Is Nothing Then
Exit For
ElseIf tcpClient(no).objSck.Connected = False Then
Exit For
End If
Next
If no < tcpClient.GetLength(0) Then ' クライアントとの送受信オブジェクト生成 tcpClient(no) = New ClientTcpIp tcpClient(no).intNo = no + 1 tcpClient(no).objSck = tcpClient tcpClient(no).objStm = tcpClient.GetStream() ' クライアントとの送受信開始 Dim tcpClientThread As New Thread( _ New ThreadStart(AddressOf tcpClient(no).ReadWrite)) tcpClientThread.Start() Else ' 接続拒否 tcpClient.Close() End If End While Catch ex As Exception End Try End Sub '--------------------------- ' 4. クライアントとの送受信 '--------------------------- Public Class ClientTcpIp Public no As Integer Public objSocket As Sockets.TcpClient Public objStream As Sockets.NetworkStream ' クライアント送受信 Public Sub ReadWrite() Try While True ' ソケット受信 Dim rdat As Byte() = New Byte(1023) {} Dim ldat As Int32 = objStream.Read(rdat, 0, rdat.GetLength(0)) If ldat > 0 Then
' クライアントからの受信データ有り
' 送信データ作成
Dim sdat As Byte() = New Byte(ldat - 1) {}
Array.Copy(rdat, sdat, ldat)
Dim msg As String = "(" & no & ")" & _
System.Text.Encoding.GetEncoding( _
"SHIFT-JIS").GetString(sdat)
sdat = System.Text.Encoding.GetEncoding( _
"SHIFT-JIS").GetBytes(msg)
' ソケット送信
objStream.Write(sdat, 0, sdat.GetLength(0))
Else
' ソケット切断有り
' ソケットクローズ
objStream.Close()
objSocket.Close()
Return
End If
End While
Catch ex As Exception
End Try
End Sub
End Class
End Class
|
TCP/IPクライアント側のサンプルプログラム
VB.netでTCP/IPソケット通信するクライアント側のサンプルプログラムです。このサンプルではタイマー処理で受信データのチェックを行っています。サンプルプログラムは大きく分けると次のような処理を行っています。
1. 起動時の接続処理(FormTcpCl_Load処理)
2. 終了時の切断処理(FormTcpCl_FormClosed処理)
3. ソケット送信処理(Button1_Click処理)
4. ソケット受信処理(Timer1_Tick処理)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
'====================================================
' TCP/IPソケット通信 クライアント側
'====================================================
Public Class FormTcpCl
' ソケット生成
Private objSocket As New System.Net.Sockets.TcpClient
Private objStream As System.Net.Sockets.NetworkStream
'---------------------------
' 1. 起動時の接続処理
'---------------------------
Private Sub FormTcpCl_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
' ソケット接続
objSocket.Connect("127.0.0.1", 8888)
' ソケットストリーム取得
objStream = objSocket.GetStream()
End Sub
'---------------------------
' 2. 終了時の切断処理
'---------------------------
Private Sub FormTcpCl_FormClosed( _
ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) _
Handles MyBase.FormClosed
' ソケットクローズ
objStream.Close()
objSocket.Close()
End Sub
'---------------------------
' 3. ソケット送信処理 (Button1をクリック)
'---------------------------
Private Sub Button1_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
' ソケット送信
Dim dat As Byte() = _
System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes("TCP/IPクライアントから送信!")
objStream.Write(dat, 0, dat.GetLength(0))
End Sub
'---------------------------
' 4. ソケット受信処理 (タイマーでチェック)
'---------------------------
Private Sub Timer1_Tick( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Timer1.Tick
' ソケット受信
If objSocket.Available > 0 Then
Dim dat As Byte() = New Byte(objSocket.Available - 1) {}
objStream.Read(dat, 0, dat.GetLength(0))
MessageBox.Show( _
System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(dat))
End If
End Sub
End Class
|
UDP/IPのサンプルプログラム
TCP/IP通信では、クライアント側とサーバ側でそれぞれ異なるプログラムを作成する必要がありました。UDP/IP通信の場合は、クライアント側とサーバ側で処理の区別は無いので共通のプログラム処理になります。
VB.netでUDP/IPソケット通信するサンプルプログラムです。このサンプルではタイマー処理で受信データのチェックを行っています。サンプルプログラムは大まかに次のような処理を行っています。
1. 起動時の接続設定(FormUdp_Load処理)
2. 終了時の切断設定(FormUdp_FormClosed処理)
3. ソケット送信処理(Button1_Click処理)
4. ソケット受信処理(Timer1_Tick)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
'====================================================
' UDP/IPソケット通信
'====================================================
Public Class FormUdp
' ソケット生成
Private objSocket As New System.Net.Sockets.UdpClient(7777)
'---------------------------
' 1. 起動時の接続設定
'---------------------------
Private Sub FormUdp_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
' ソケット接続
objSocket.Connect("127.0.0.1", 8888)
End Sub
'---------------------------
' 2. 終了時の切断設定
'---------------------------
Private Sub FormUdp_FormClosed( _
ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) _
Handles MyBase.FormClosed
' ソケットクローズ
objSocket.Close()
End Sub
'---------------------------
' 3. ソケット送信処理 (Button1をクリック)
'---------------------------
Private Sub Button1_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
' ソケット送信
Dim dat As Byte() = _
System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes("UDP/IPで送信!")
objSocket.Send(dat, dat.GetLength(0))
End Sub
'---------------------------
' 4. ソケット受信処理 (タイマーでチェック)
'---------------------------
Private Sub Timer1_Tick( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Timer1.Tick
' ソケット受信
If objSocket.Available > 0 Then
Dim ipAny As System.Net.IPEndPoint = _
New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
Dim dat As Byte() = objSocket.Receive(ipAny)
MessageBox.Show( _
System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(dat))
End If
End Sub
End Class
|
- システム
エンジニア - プログラムとTCP/IPを結ぶ出入り口がソケット通信ということですね。
- プロジェクト
マネージャー - 異なったOS同士での通信を可能にする共通ルールだと考えれば、理解が早くなりましね。
VB.netでソケット通信を理解する
今回はソケット通信の概要とVB.netを使用したソケット通信のサンプルプログラムをご紹介しました。
VB.netでは、TCP/IPならTcpClientクラスやTcpListenerクラス、UDP/IPならUdpClientクラスが用意されているので、これらを使用すればVB.netで簡単にソケット通信のプログラムを作成することができます。
実際にプログラミングすると、ソケット通信への理解もより一層深まるので、ぜひチャレンジしてみましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)