基本サーバープログラム VB編

基本的なサーバーの動作は次のようになります。 なお、ストリームの説明は、ここをクリックください。

  1. マシンのホスト名を取得し、ホスト名からリゾルバのライブラリで、使用可能なIPアドレスのリストを取得します。
    (System.Net.IPAddress の配列で取得できる。)

  2. 上記で取得したIPアドレスのリストから得られるIPアドレスとポート番号で、サーバーオブジェクトを生成し起動します。
    (TcpListener(ipAdrs(0), port)で、サーバーオブジェクトを生成)

  3. サーバーオブジェクトで、クライアントからの接続を待ちます。クライアントが接続要求があれば、それを受け入れます。 その時、クライアントと通信するためのオブジェクト(TcpClient型)を取得します。
    (接続してきたクライアントと通信するオブジェクト取得⇒ tcpC As TcpClient = server.AcceptTcpClient())

  4. 通信するオブジェクトから、用受信するためのストリームを取得
    (この時、クライアントへの送信用のストリーム(sw=StreamWriter)と、受信用ストリーム(sr=StreamReader)を得る。)

  5. 必要に応じてデータを受信し⇒データ = sr.ReadLine()、
    データを送信する⇒sw.WriteLine(データ)。

  6. 接続を閉じるtcpC.Close()
    (先に、クライアントへの送信用(sw)と、受信用ストリーム(sr)を閉じる。)

4〜6の送受信ストリームを得てから終了するまでのスタイルは、クライアントプログラムと同じ手法となります。 以下のプログラムで、この色の部分です

以下に サーバを起動して待機状態にし、 クライアントが49152のポートで接続してきたら、その接続要求を受け入れ、
クライアントから送られてた1行を受信してそれを表示し、
コンソール画面からキー入力した1行を、クライアントに送信して、
接続を閉じるプログラムを示します。

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

        Dim port As Integer = 49152 'ポート番号を記憶する変数用意
        Dim host As String = System.Net.Dns.GetHostName()    '使用しているマシンのhost名を取得
        Console.WriteLine("host名:" & host) 'host名を画面に表示
        
        Dim ipHost As IPHostEntry = Dns.Resolve(host) 'このホストの情報取得
        Dim ipAdrs() As IPAddress = ipHost.AddressList 'このホストが使えるipアドレス群を取得
        Console.WriteLine("IPアドレス:" & ipAdrs(0).ToString()) '先頭カードのIPアドレスを画面に表示
        Dim server As New TcpListener(ipAdrs(0), port) 'サーバー用オブジェクト生成

        server.Start()  'サーバー起動

        Dim tcpC As TcpClient = server.AcceptTcpClient() 'クライアントからの接続要求を受け入れる(接続を待っている)
        Dim enc As Encoding = Encoding.GetEncoding("shift-jis") '送受信したバイト列と文字列の変換を行うオブジェクトを取得

        'クライアントと送受信するためのストリームを取得
        Dim sw As StreamWriter = New StreamWriter(tcpC.GetStream(), enc) '送信ストリームを生成
        Dim sr As StreamReader = New StreamReader(tcpC.GetStream(), enc) '受信ストリームを生成
        Dim msg As String '文字列を記憶するための変数用意

        'データの受信
        Console.WriteLine("受信データ待ち状態") '画面に表示
        msg = sr.ReadLine() 'クライアントから文字列を受信し、その受信した文字列を、msg に記憶
        Console.WriteLine(msg) '受信文字列を画面に表示

        'データの送信
        Console.Write("入力>") '画面に表示
        msg = Console.ReadLine() 'キー入力させて、その入力した文字列を、msg に記憶
        sw.WriteLine(msg) '文字列をクライアントへ送信

        sw.Close() '送信ストリームを閉じる
        sr.Close() '受信ストリームを閉じる
        tcpC.Close() '接続を閉じる
        server.Stop() 'リスナを閉じます。(待機状態の停止)

    End Sub

End Sub

	

なお上記プログラムソースの先頭で、クラスを使うための次の記述が必要になります。 このImportsは、クラスが属する空間名を指定するものです。

Imports System.Net  'IPAddress, IPHostEntry,Dnsクラスを使うため
Imports System.Net.Sockets  'TcpListener ,TcpClientクラスを使うため
Imports System.Text 'Encodingクラスを使うため
Imports System.IO   'StreamReaderやStreamWriterクラスを使うため