1. 程式人生 > >C#程式設計 socket程式設計之tcp伺服器端和客戶端

C#程式設計 socket程式設計之tcp伺服器端和客戶端

基於Tcp協議的Socket通訊類似於B/S架構,面向連線,但不同的是伺服器端可以向客戶端主動推送訊息。

使用Tcp協議通訊需要具備以下幾個條件:

(1).建立一個套接字(Socket)

(2).繫結伺服器端IP地址及埠號--伺服器端

(3).利用Listen()方法開啟監聽--伺服器端

(4).利用Accept()方法嘗試與客戶端建立一個連線--伺服器端

(5).利用Connect()方法與伺服器建立連線--客戶端

(6).利用Send()方法向建立連線的主機發送訊息

(7).利用Recive()方法接受來自建立連線的主機的訊息(可靠連線)

 

下面用程式碼實現簡單的伺服器---客戶端通訊,在此例項中兩方只能收發一次訊息,如果要進行多次訊息,要使用到執行緒。

伺服器端:

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

namespace _021_socket程式設計_TCP協議 {
    class Program {
        static void Main(string[] args) {
            // 1,建立socket
            Socket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //2,繫結ip跟埠號 
            IPAddress ipaddress = new IPAddress(new byte[]{192,168,1,101});
            EndPoint point = new IPEndPoint(ipaddress,7788);//ipendpoint是對ip+埠做了一層封裝的類
            tcpServer.Bind(point);//向作業系統申請一個可用的ip跟埠號 用來做通訊
            //3,開始監聽 (等待客戶端連線)
            tcpServer.Listen(100);//引數是最大連線數
            Console.WriteLine("開始監聽");

            Socket clientSocket = tcpServer.Accept();//暫停當前執行緒,直到有一個客戶端連線過來,之後進行下面的程式碼
            Console.WriteLine("一個客戶端連線過來了");
            //使用返回的socket跟客戶端做通訊
            string message = "hello 歡迎你";
            byte[] data = Encoding.UTF8.GetBytes(message);//對字串做編碼,得到一個字串的位元組陣列
            clientSocket.Send(data);
            Console.WriteLine("向客戶端傳送了一條資料");

            byte[] data2 = new byte[1024];//建立一個位元組陣列用來當做容器,去承接客戶端傳送過來的資料
            int length = clientSocket.Receive(data2);
            string message2 = Encoding.UTF8.GetString(data2, 0, length);//把位元組資料轉化成 一個字串
            Console.WriteLine("接收到了一個從客戶端傳送過來的訊息:"+message2);

            Console.ReadKey();
        }
    }
}

 客戶端:

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

namespace _001_socket程式設計_tcp協議_客戶端 {
    class Program {
        static void Main(string[] args) {
            //1,建立socket
            Socket tcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

            //2,發起建立連線的請求
            IPAddress  ipaddress = IPAddress.Parse("192.168.1.101");//可以把一個字串的ip地址轉化成一個ipaddress的物件
            EndPoint point = new IPEndPoint(ipaddress,7788);
            tcpClient.Connect(point);//通過ip:埠號 定位一個要連線到的伺服器端
            byte[] data = new byte[1024];
            int length = tcpClient.Receive(data);//這裡傳遞一個byte陣列,實際上這個data陣列用來接收資料
            //length返回值表示接收了多少位元組的資料
            string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的資料做一個轉化
            Console.WriteLine(message);

            //向伺服器端傳送訊息
            string message2 = Console.ReadLine();//讀取使用者的輸入 把輸入傳送到伺服器端
            tcpClient.Send( Encoding.UTF8.GetBytes(message2) );//把字串轉化成位元組陣列,然後傳送到伺服器端 

            Console.ReadKey();
        }
    }
}

執行過程:

(1)首先開啟伺服器

(2)然後開啟客戶端,此時,客戶端連線到伺服器,收到伺服器發來的訊息

(3)在客戶端輸入一條訊息發給伺服器