|
|||||
<このサンプルの概要> ソケット(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 { } } } } |