วันจันทร์ที่ 16 สิงหาคม พ.ศ. 2553

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






เนื้อหาประกอบด้วย
  • TcpClient class : components และตัวอย่างประกอบ
  • TcpListener class :conponents และตัวอย่าง
  • การเคลื่อนย้ายข้อมูล ไบนารี่ ที่เข้ามาในเครือข่าย
  • การติดต่อสื่อสารด้วย host ชนิดอื่นๆ
  • การใช้ คลาสของข้อมูลเพื่อเลื่อนย้ายอ็อปเจ็คที่มีความซับซ้อนบนระบบเครือข่าย


ผมไม่ชอบกินน้ำเท่าไรนะครับเข้าเนื้อหากันเลยดีกว่าครับ
---------------------------------------------------------------------
TcpClient Class
     คลาสนี้อยู่ภายใต้ namespace ที่ชื่อว่า  "System.Net.Sockets"  เพราะฉะนั้นก่อนที่เราจะทำการเรียกใช้คลาสนี้ต้องสั่ง Using "System.Net.Socket" ก่อนนะครับ 
     คลาสนี้ถูกออกแบบมาเพื่ออำนวยความสะดวกในการเขียน TCP Client Application ซึ่งในการสร้างอ็ออปเจ็คของคลาสนี้จะมีคอนตรัคเตอร์อยู่ 3 รูปแบบด้วยกันคือ

  1. TcpClient() แบบนี้ในการสร้างอ็อปเจ็คใหม่เราไม่ต้องระบุพารามิเตอร์ใดๆลงไป การสร้างแบบนี้โปรแกรมจะระบุ ip address เป็นของเครื่องตัวเอง และสุ่มพอร์ตในการติดต่อสื่อสารขึ้นมาเอง และเมื่อสร้างอ็อปเจ็กขึ้นมาแล้วถ้าต้องการให้ โปรแกรมเริ่มเชื่อต่อเราต้องทำการเรียก method ชื่อว่า connect() เพื่อใช้ในการเชื่อมต่อไปยังอุปกรณ์ที่เราต้องการเชื่อมต่อด้วย

    ตัวอย่าง
          TcpClient newcon = new TcpClient();
          newcon.Connect("www.isp.net",8000);
  2. TcpClient(IPEndPoint  localEP) ใช้เมื่อต้องการกำหนด IP Address และ port ที่ติดต่อสื่อสารแบบเจาะจงปกติจะใช้กับเครื่องที่มีการ์ดแลนมากกว่า 1 ใบ และเมื่อสร้างอ็อปเจ็คก็ต้องทำการเรียก method connect() เพื่อเริ่มการเชื่อมต่อเช่นเดียวกับแบบแรก

    ตัวอย่าง
         IPEndPoint iep = new TcpClient(IPAddress.Parse("192.168.1.6"),8000);

         TcpClient newcon = new TcpClient(iep);
         newcon.Connect("www.isp.net",8000);

  3. TcpClient(string host,int port) แบบนี้เป็นแบบที่ใช้กันมากที่สุด มันจะทำการเชื่อมต่อกับอุปกรณ์โดยไม่จำเป็นต้องใช้ method Connect();

    ตัวอย่าง
         TcpClient newcon = new TcpClient("www.isp.net",8000);
อ็อปเจ็คของ TcpClient สามารถใช้คุณสมบัติและ method ในการรับส่งข้อมูลกับอุปกรณ์ที่เราสื่อสารระยะไกลได้

Method ของ TcpClient Class


 method
 คำอธิบาย
 Close()
 ปิดการเชื่อมต่อ TCP Connetion
 Connect()
 สร้างการเชื่อมต่อ TCP Connection กับอุปกรณ์
 Equals()
 กำหนดเมื่อ 2 TcpClient อ็อปเจ็คเหมือนกัน
 GetHashCode()
 เรียกดูค่า hash code
 GetStream()
 เรียกค่า stream ของอ็อปเจ็คใช้เพื่อส่งและรับข้อมูล
 GetType()
 ดูค่าชนิดของตัวอย่างปัจจุบัน
 ToString()
 แปลงค่าข้อมูลตัวอย่างปัจจุบันเป็นตัวสตริง
       เมื่อเราทำการสร้างอ็อปเจ็คของ TcpClient Class และสั่งเชื่อมต่อแล้ว เพื่อที่เราจะสามารถใช้ GetStream() ได้เราต้องทำการสร้าง NetworkStream อ็อปเจ็คขึ้นมาเพื่อใช้ในการรับส่งข้อมูล เมื่อสร้าง อ็อปเจ็คของ NetworkStream ขึ้นมาแล้วเราจะได้ Read() และ Write เพื่อใช้ในการรับส่งข้อมูลใน Stream ข้อมูลในระบบเครือข่าย
ตัวอย่าง โปรแกรม Client อย่างง่าย
         
       ตัวอย่างนี้จะช่วยให้เข้าใจได้ง่ายขึ้นโค้ดโปรแกรมสามารถเขียนให้สั่นได้มากกว่านี้เมื่อมีความชำนาญแล้ว

โค้ดโปรแกรมตัวอย่าง
    using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TcpClientSample
{
    class Program
    {
         static void Main()
        {
            byte[] data = new byte[1024];
            //บัพเฟอร์สำหรับใช้ในการพักข้อมูล
            string input, stringData;
            TcpClient server; 
            //ประกาศตัวแปรชนิด TcpClient ไว้เพื่อเตรียมสร้าง Object TcpClient

            server = new TcpClient("127.0.0.1",6500);
            //สร้างอ็อปเจ็คและการเชื่อมต่อ TCP มายังเครื่องตัวเอง port 6500
            NetworkStream ns = server.GetStream(); 
            //สร้าง NetworkStream อ็อปเจ็คเพื่อนำมาใช้จัดการข้อมูล Stream ที่อ็อปเจ็ค server ใช้

            int recv = ns.Read(data,0,data.Length);
            //data คือ byte array ที่จะนำมารับข้อมูลที่อ่านมาโดย 0 คือ index ของ array ที่ใช้ในการเริ่มเก็บข้อมูลและ data.Length ขนาดของบัพเฟอร์

            stringData = Encoding.ASCII.GetString(data,0,recv);//เข้ารหัสข้อมูลที่ได้แบบ ASCII c]h;เก็บข้อมูลลงในตัวแปร stringData
            Console.WriteLine(stringData);//แสดงค่า ข้อมูลที่รับมา

            while (true) //รอรับข้อมูลจากเซอร์เวอร์ จะออกเมื่อ ป้อน "exit"
            {
                input = Console.ReadLine();  //รับข้อมูล
                if (input == "exit")   // ตรวจสอบข้อมูลว่าเท่ากับ "exit หรือไม่"
                    break;                //เมื่อ input เท่ากับ exit ออกจากลูปการรับค้า
                ns.Write(Encoding.ASCII.GetBytes(input),0,input.Length); //ส่งข้อมูลไปยัง server
                ns.Flush();

                data = new byte[1024];
                recv = ns.Read(data,0,data.Length);
                stringData = Encoding.ASCII.GetString(data,0,recv);
                Console.WriteLine(stringData);
            }
            Console.WriteLine("Disconnecting from server ....");
            ns.Close();
            server.Close();
            Console.ReadLine();
        }
    }
}

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

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