Socket編程初探

一.什麼是Socket?

      一般也稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄。在Internet上的主機通常運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不一樣的端口對應於不一樣的服務。Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如佈滿各類插座的房間,每一個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不一樣編號的插座,就能夠獲得不一樣的服務。編程

二.三次握手   

     在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接。       服務器

     第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;           spa

     第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態      orm

     第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次blog

握手,客戶端與服務器開始傳送數據.string

三.Socket編程思路

   服務端:it

   1.監聽客戶請求,使用Socket用於監聽io

   2.根據客戶請求爲客戶建立Socket,爲每個客戶建立新的Socketclass

   服務端至少須要兩個Socket,一個Socket負責監聽客戶請求,另外一個Socket用於處理客戶請求thread

   客戶端:

   1.向服務端發起請求,使用Socket用於請求服務端     

四.實例

   服務端:

using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace 套接字
{
    public partial class ServerFrm : Form
    {
        //負責監聽端口
        Socket sokWelcome = null;
        Thread thdWatchPort = null;
        //負責與客戶端通訊
        Socket sokConnection = null;

        public ServerFrm()
        {
            InitializeComponent();

            TextBox.CheckForIllegalCrossThreadCalls = false;
        }

        private void btnStartListen_Click(object sender, EventArgs e)
        {
            StartListen();
        }

        public void StartListen()
        {
            //獲取IP地址
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            //獲取IP節點
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //建立監聽套接字(尋址協議,流方式,TCP協議)
            sokWelcome = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sokWelcome.Bind(endPoint);
            sokWelcome.Listen(10);
            ShowMessage("開始監聽...");
            thdWatchPort = new Thread(WatchPort);
            thdWatchPort.Start();
        }

        public void WatchPort()
        {
            while (true)
            {
                sokConnection = sokWelcome.Accept();
                ShowMessage("監聽到鏈接啦!!!");
            }    
        }

        public void ShowMessage(string message)
        {
            txtShowMessage.AppendText(message+"\r\n");
        }
    }
}

    客戶端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace 套接字客戶
{
    public partial class ClientFrm : Form
    {
        Socket sokClient = null;
        Thread threadClient = null;

        public ClientFrm()
        {
            InitializeComponent();
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            Connect();
        }
       
        private void Connect()
        {
            sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            sokClient.Connect(endPoint);
        }
    }
}
相關文章
相關標籤/搜索