วันอังคารที่ 17 สิงหาคม พ.ศ. 2553

การใช้งาน C# Socket Helper Classes (ตอนที่ 2: TcpListenner )








TcpListenenner Class 
     TcpListener Class จะอยู่ภายใต้ namespace System.Net.Sockets ซึ่งคลาสในนี้จะใช้ในการอำนวยความสะดวก ในการสร้าง TCP Server Application
  

 TcpListener มีคอนตรัคเตอร์ 3 แบบด้วยกันคือ

  1. TcpListener(int port) คอนตรัคเตอร์ตัวนี้จะทำการสร้างและกำหนดพอร์ตที่ใช้ในการติดต่อสื่อสารทาง TCP ของตัวโปรแกรมขึ้นมา
  2. TcpListener(IPEndPoint ie) คอนครัคเตอร์ตัวนี้จะทำการกำหนด IP address ที่จะรอรับข้อมูล  ใช้เมื่อเครื่องมี การ์ดแลนมากกว่า 1 ตัว และและเราต้องการจะระบุว่าจะรอรับข้อมูลจากการ์ดแลนตัวใดตัวหนึ่งโดยไม่ระบุว่าพอร์ดใด
  3. TcpListener(IPAddress addr,int port) คอนครัตเตอร์ตัวนี้จะกำหนดทั้ง IP Address และ พอร์ตที่จะรอรับข้อมูล ใช้เมื่อเครื่องมีการ์ดแลนมากกว่า 1 ใบ โดยจะทำการเลือกการ์ดแลนใบใดใบหนึ่งและเลือกข้อมูลที่เข้ามาทางพอร์ตที่กำหนดเท่านั้น
Method ใน TcpListener Class 
 Method
 คำอธิบาย
 AcceptSocket()
 ยอมรับการเชื่อมต่อที่ผ่านเข้ามาตามพอร์ตที่กำหนดไว้ใน อ็อปเจ็คของ Socket
 AcceptTcpClient()
 ยอมรับการเชื่อมต่อที่ผ่านเข้ามาตามพอร์ตที่กำหนดไว้ใน อ็อปเจ็คของ TcpClient
 Equals()
 กำหนด ถ้ามี 2 TcpClient Object ที่เหมือนกัน
 GetHashCode()
 รับ hash code ที่เหมาะสมที่จะใช้ในฟังชั้น
 GetType()
 รับชนิดปัจจุบันของตัวอย่าง
 Pending()
 กำหนดถ้าฝังตรงข้ามต้องการการอนุมัติ
 Start()
 เริ่มรอรับข้อมูลผ่านเข้ามาทางช่องทางเชื่อมต่อ
 Stop()
 หยุดการรอรับข้อมูล
 ToString();
 สร้างสติงที่จะแสดงของ TcpListener อ็อปเจ็ค

กระบวนการทำงานและการสร้าง TcpListener อ็อปเจ็คเพื่อรอรับข้อมูลมีดังนี้
    
    TcpListenner server = new TcpListener(IPAddress.Parse("127.0.0.1"),6500);
    Server.Start();
    TcpClient newclient = server.AcceptTcpClient();

       เริ่มจากเราสร้าง อ็อปเจ็คของ TcpListener ขึ้นมา จากนั้นเราก็เรียก method Start() เพื่อให้โปรแกรมรอรับข้อมูลจากไอพีและพอร์ตที่กำหนด เพียงเท่านี้โปรแกรมเราก็จะพร้อมที่จะรอรับการเชื่อมต่อเข้ามาใหม่แล้ว
       จากนั้นสร้าง TcpClient อ็อปเจ็คขึ้นมา ทุกการสื่อสาร กับอุปกรณ์จะดำเนินการด้วย TcpClient อ็อปเจ็คcและเมื่อใช้งานเสร็จเราต้องทำการเรียก method Close() ให้กับ TcpClient และ method Stop() ให้ TcpListener อ็อปเจ็ค

หมายเหตุ ห้ามลืมเด็ดขาด ต้อง Close() ให้กับ TcpClient อ็อปเจ็ค ก่อนเรียก Stop() ให้ TcpListener 
อ็อปเจ็ค เสมอ



*************************************


โปรแกรมตัวอย่าง


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TcpListennerSample
{
    class Program
    {
        static void Main()
        {
            int recv;
            byte[] data = new byte[1024];

            TcpListener newsock = new TcpListener(6500);
            newsock.Start();
            Console.WriteLine("Waiting for Client ....");

            TcpClient client = newsock.AcceptTcpClient();
            NetworkStream ns = client.GetStream();

            string welcome = "Welcome to my test server";
            data = Encoding.ASCII.GetBytes(welcome);
            ns.Write(data,0,data.Length);

            while (true)
            {
              data = new byte[1024];
              recv = ns.Read(data,0,data.Length);
              if (recv == 0)
                  break;
              Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));

              ns.Write(data,0,recv);
            }
            ns.Close();
            client.Close();
            newsock.Stop();

        }
    }
}

**********************************************************
อธิบายโปรแกรม

ในการสร้างโปรแกรม  TcpListennerSample  เริ่มต้นจากการสร้าง TcpListenner object จะใช้ TCP พอร์ต 6500 จากนั้นก็เริ่ม Start() method  ในส่วนถัดมาเป็นการสร้างอ็อปเจ็คใหม่เพื่อรอรับข้อมูล จากนั้นก็ใช้ AcceptTcpClient() method เพื่อรอรับการเข้ามาของ TCP Connection หรือการร้องขอต่างๆ


            TcpListener newsock = new TcpListener(6500);
            newsock.Start();

            TcpClient client = newsock.AcceptTcpClient();
            NetworkStream ns = client.GetStream();

ในการทำงานกับข้อมูลในสตรีมของข้อมูลในการสื่อสารทาง TCP เราต้องมีอ็อปเจ็ค ของ NetworkStream มาใช้ในการอ่านและเขียนเพราะอ็อปเจ็คของ NetworkStream นั้นมี method Read() และ Write() ใช้ในการอ่านและเขียนข้อมูลในสตรีมข้อมูลนั้นเอง 

ข้อควรจำ method Read() และ Write() ของ NetworkStream นั้นรับข้อมูลเป็นอาร์เรย์ชนิด byte เท่านั้น


เราสามารถทดสอบโปรแกรมได้จากการรัน โปรแกรม TcpListennerSample และ TcpClientSample จากบทความตอนที่แล้วครับ
---------------------------------------------------

ไม่มีความคิดเห็น:

แสดงความคิดเห็น