NonSoft

TCP/IPサーバでの送受信サンプル(C#/VB.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
ソケット(TCP/IP)を使用して電文の送受信(サーバ側)をするC#/VB.NETのサンプルソースです。
クライアント側はソケット(TCP/IP)での送受信サンプル(C#/VB.NET)です。

ソケット(TCP/IP)の接続手順は以下の通りです。
1.IPアドレス&ポート番号設定
2.リスナーオブジェクト生成
3.リスナー開始
4.ソケット接続待ちスレッド開始

ソケット接続待ち手順は以下の通りです。
1.ソケット接続待ち
2.クライアント送受信オブジェクト生成
3.クライアント送受信スレッド開始

クライアント送受信手順は以下の通りです。
1.ソケット受信
2.ソケット送信

ソケット関係のその他のサンプルソースやツールはこちらです。
このサンプルの通信テストでもこちらのツールを使用しました。
通信サンプルやツール(RS232C TCP/IP UDP/IP)

' VB.NETのソケット通信サンプル
Imports System.Threading
Imports System.Net

Public Class Form1
    ' ソケット・リスナー
    Private myListener As Sockets.TcpListener
    ' クライアント送受信
    Private myClient As ClientTcpIp() = New ClientTcpIp(3) {}

    ' フォームロード時のソケット接続処理
    Private Sub Form1_Load( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load
        ' IPアドレス&ポート番号設定
        Dim myPort As Integer = 8888
        Dim myEndPoint As New IPEndPoint(IPAddress.Any, myPort)

        ' リスナー開始
        myListener = New Sockets.TcpListener(myEndPoint)
        myListener.Start()

        ' クライアント接続待ち開始
        Dim myServerThread As New Thread(New ThreadStart(AddressOf ServerThread))
        myServerThread.Start()
    End Sub

    ' フォームクローズ時のソケット切断処理
    Private Sub Form1_FormClosed( _
        ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) _
        Handles Me.FormClosed
        ' リスナー終了
        myListener.Stop()
        ' クライアント切断
        For i As Integer = 0 To myClient.GetLength(0) - 1
            If myClient(i) Is Nothing = False AndAlso _
                   myClient(i).objSck.Connected = True Then
                ' ソケットクローズ
                myClient(i).objStm.Close()
                myClient(i).objSck.Close()
            End If
        Next
    End Sub

    ' クライアント接続待ちスレッド
    Private Sub ServerThread()
        Try
            Dim intNo As Integer
            While True
                ' ソケット接続待ち
                Dim myTcpClient As Sockets.TcpClient = myListener.AcceptTcpClient()
                ' クライアントから接続有り
                For intNo = 0 To myClient.GetLength(0) - 1
                    If myClient(intNo) Is Nothing Then
                        Exit For
                    ElseIf myClient(intNo).objSck.Connected = False Then
                        Exit For
                    End If
                Next
                If intNo < myClient.GetLength(0) Then
                    ' クライアント送受信オブジェクト生成
                    myClient(intNo) = New ClientTcpIp
                    myClient(intNo).intNo = intNo + 1
                    myClient(intNo).objSck = myTcpClient
                    myClient(intNo).objStm = myTcpClient.GetStream()
                    ' クライアントとの送受信開始
                    Dim myClientThread As New Thread( _
                        New ThreadStart(AddressOf myClient(intNo).ReadWrite))
                    myClientThread.Start()
                Else
                    ' 接続拒否
                    myTcpClient.Close()
                End If
            End While
        Catch ex As Exception
        End Try
    End Sub

    ' クライアント送受信クラス
    Public Class ClientTcpIp
        Public intNo As Integer
        Public objSck As Sockets.TcpClient
        Public objStm As Sockets.NetworkStream

        ' クライアント送受信スレッド
        Public Sub ReadWrite()
            Try
                While True
                    ' ソケット受信
                    Dim rdat As Byte() = New Byte(1023) {}
                    Dim ldat As Int32 = objStm.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 = "(" & intNo & ")" & _
                            System.Text.Encoding.GetEncoding( _
                                "SHIFT-JIS").GetString(sdat)
                        sdat = System.Text.Encoding.GetEncoding( _
                            "SHIFT-JIS").GetBytes(msg)
                        ' ソケット送信
                        objStm.Write(sdat, 0, sdat.GetLength(0))
                    Else
                        ' ソケット切断有り
                        ' ソケットクローズ
                        objStm.Close()
                        objSck.Close()
                        Return
                    End If
                End While
            Catch ex As Exception
            End Try
        End Sub
    End Class
End Class

// C#.NETのソケット通信サンプル
using System.Threading;
using System.Net;
using System.Net.Sockets;

public partial class Form1 : Form
{
    // ソケット・リスナー
    private TcpListener myListener;
    // クライアント送受信
    private ClientTcpIp[] myClient = new ClientTcpIp[4];

    // フォームロード時のソケット接続処理
    private void Form1_Load(object sender, EventArgs e)
    {
        // IPアドレス&ポート番号設定
        int myPort = 8888;
        //IPAddress myIp = Dns.Resolve("localhost").AddressList[0]; // 旧バージョン
        IPAddress myIp = Dns.GetHostEntry("localhost").AddressList[0];
        IPEndPoint myEndPoint = new IPEndPoint(myIp, myPort);

        // リスナー開始
        myListener = new TcpListener(myEndPoint);
        myListener.Start();

        // クライアント接続待ち開始
        Thread myServerThread = new Thread(new ThreadStart(ServerThread));
        myServerThread.Start();
    }

    // フォームクローズ時のソケット切断処理
    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // リスナー終了
        myListener.Stop();
        // クライアント切断
        for (int i = 0; i <= myClient.GetLength(0) - 1; i++)
        {
            if (myClient[i] != null ){
                if (myClient[i].objSck.Connected == true)
                {
                    // ソケットクローズ
                    myClient[i].objStm.Close();
                    myClient[i].objSck.Close();
                }
            }
        }
    }

    // クライアント接続待ちスレッド
    private void ServerThread()
    {
        try
        {
            int intNo;
            while (true)
            {
                // ソケット接続待ち
                TcpClient myTcpClient = myListener.AcceptTcpClient();
                // クライアントから接続有り
                for (intNo = 0; intNo <= myClient.GetLength(0) - 1; intNo++)
                {
                    if (myClient[intNo] == null)
                    {
                        break;
                    }else if( myClient[intNo].objSck.Connected == false){
                        break;
                    }
                }
                if (intNo < myClient.GetLength(0))
                {
                    // クライアント送受信オブジェクト生成
                    myClient[intNo] = new ClientTcpIp();
                    myClient[intNo].intNo = intNo + 1;
                    myClient[intNo].objSck = myTcpClient;
                    myClient[intNo].objStm = myTcpClient.GetStream();
                    // クライアントとの送受信開始
                    Thread myClientThread = new Thread(
                        new ThreadStart(myClient[intNo].ReadWrite));
                    myClientThread.Start();
                }
                else
                {
                    // 接続拒否
                    myTcpClient.Close();
                }
            }
        }
        catch { }
    }

    // クライアント送受信クラス
    public class ClientTcpIp
    {
        public int intNo;
        public TcpClient objSck;
        public NetworkStream objStm;

        // クライアント送受信スレッド
        public void ReadWrite()
        {
            try
            {
                while (true)
                {
                    // ソケット受信
                    Byte[] rdat = new Byte[1024];
                    int ldat = objStm.Read(rdat, 0, rdat.GetLength(0));
                    if (ldat > 0)
                    {
                        // クライアントからの受信データ有り
                        // 送信データ作成
                        Byte[] sdat = new Byte[ldat];
                        Array.Copy(rdat, sdat, ldat);
                        String msg = "(" + intNo + ")" +
                            System.Text.Encoding.GetEncoding(
                                "SHIFT-JIS").GetString(sdat);
                        sdat = System.Text.Encoding.GetEncoding(
                            "SHIFT-JIS").GetBytes(msg);
                        // ソケット送信
                        objStm.Write(sdat, 0, sdat.GetLength(0));
                    }else{
                        // ソケット切断有り
                        // ソケットクローズ
                        objStm.Close();
                        objSck.Close();
                        return;
                    }
                }
            }
            catch { }
        }
    }
}