1. 程式人生 > >c#socket TCP同步網絡通信

c#socket TCP同步網絡通信

通過 內容 主機 put back 32位 接收 兩種方法 ddr

一、socket簡介

  socket就是套接字,它是引用網絡連接的特殊文件描述符,由三個基本要素組成:

    1: AddressFamily(網絡類型)

    2: SocketType(數據傳輸類型)

    3:ProtocolType(采用的網絡協議)

  下面是可用於IP通信的套接字組合及其常用的屬性和方法技術分享圖片

二、socket與網絡通信 

  IP連接領域有兩種通信類型:面向連接的和無連接的,這裏我要講的是面向連接的,使用TCP協議來建立兩個IP的值端點之間的會話,下面是它的基本步驟。

    a:建立一個套接字

    b:綁定本機的IP和端口

    c:使用listen()方法監聽別人發過來的東西

    d:如果監聽到連接,則可以使用Send/Receive來執行操作

    e:完成後使用Close()方法進行關閉

  工作原理如圖所示:

  技術分享圖片

三、一個簡單的同步通信示例

  1.服務器端

using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace socket服務端
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 23456;//端口號
            int recv;//記錄客戶端信息的長度
            string address = "127.0.0.1";//IP地址,指向localhost主機名,常用於程序調試
            IPAddress addr = IPAddress.Parse(address);
            IPEndPoint ipe = new IPEndPoint(addr, port);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(ipe);//綁定端口
            socket.Listen(0);//開始監聽,0表示任意數量
            Console.WriteLine("已啟動監聽,等待客戶端連接。");
            Socket clientSocket = socket.Accept();
            IPEndPoint clientIp = (IPEndPoint)clientSocket.RemoteEndPoint;//獲取遠程終結點信息
            if (clientSocket != null)
                Console.WriteLine("成功與{0}的客戶端建立聯系",clientIp);
            while (true)//用死循環不斷執行
            {
                try
                {
                    byte[] data = new byte[1024];
                    recv = clientSocket.Receive(data);//獲取客戶端傳過來的信息
                    if (recv == 0)
                        break;
                    Console.WriteLine("客戶端發來信息:{0}",Encoding.ASCII.GetString(data, 0, recv));
                    Console.Write("輸入要發送的信息:");
                    String input = Console.ReadLine();
                    clientSocket.Send(Encoding.ASCII.GetBytes(input));
                }
                catch(Exception ex)
                {
                    Console.WriteLine("ERROR:{0}", ex.Message);
                }
            }
            Console.WriteLine("斷開連接");
            clientSocket.Close();
            socket.Close();
        }
    }
}

  2.客戶端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace socket客戶端
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 23456;
            string address = "127.0.0.1";
            byte[] data = new byte[1024];
            IPAddress addr = IPAddress.Parse(address);
            IPEndPoint ipe = new IPEndPoint(addr, port);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(ipe);
            Console.WriteLine("與服務器連接成功");      

            try
            {
                while (true)
                {
                    Console.Write("輸入信息內容:");
                    string input = Console.ReadLine();
                    if (input == "exit")
                        break;
                    socket.Send(Encoding.ASCII.GetBytes(input));//發送數據
                    data = new byte[1024];
                    int recv;
                    string strData;
                    recv = socket.Receive(data);
                    strData = Encoding.ASCII.GetString(data, 0, recv);
                    Console.WriteLine("服務器發來內容:{0}",strData);
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.ToString());
            }
            Console.WriteLine("斷開連接...");
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
            Console.ReadKey();
        }
    }
}

  接下來對上面一些內容進行解釋

    a.端口號:32位無符號整形,範圍是0~65535,0~1023被系統進程和通信協議使用,1024~49251是用戶可以使用的端口

    b.IPAddress類: 該類有一個Parse()方法,可以把點分的十進制IP轉化為IPAdress類, 它還有四個可讀字段

           Any:用於代表本地系統可用的任何IP地址

           Broadcase:用於代表本地網絡的IP廣播地址

           Loopback:用於代表本地系統的回送地址

           None:用於代表本地系統上沒有網絡接口

    c.IPEndPoint是一個端口和IP地址的綁定,可以代表一個服務,用來Socket通信,可以通過兩種方法構造

           IPEndPoint( long address, int pot);

          IPEndPoint( IPAddress address, int pot)‘

    d. Accept 以同步方式從偵聽套接字,在連接請求隊列中提取第一個掛起的連接請求,然後創建並返回一個新Socket。 不能使用此返回Socket為接受任何其他連接的連接隊列。 但是,可以調用RemoteEndPoint方法所返回的Socket來標識遠程主機的網絡地址和端口號。

    e.Receive()從綁定的 Socket套接字接收數據,將數據存入接收緩沖區。

註:同步通信每發完一個數據包後,需要等待接收方響應後再繼續發送下一個數據包

運行時先啟動服務器端,再啟動客戶端

c#socket TCP同步網絡通信