C#中面向連接的客戶端與服務端編程

 

1.         簡介
1)         流程

2)         服務端程序特點
Ø 一般啓動後就一直處於運行狀態,以等待客戶端進程的請求
Ø 使用的端口往往是熟知端口,便於客戶機進程連接請求
Ø 一般擁有較多的系統資源,以便及時響應各個客戶機進程的請求
Ø 可以並行處理多個客戶機進程的請求,但數目是有一定的限制
Ø 在通信時一般處於被動的一方,不需要知道客戶機的IP地址和端口信息
3)         客戶端程序特點
Ø 在需要服務端進程的服務時將向服務器進程請求服務,並建立通信連接,得到滿足並完成處理後就終止通信連接
Ø 使用向系統申請的臨時端口與服務端進程進行通信,通信完成後將釋放該端口
Ø 擁有相對較少的系統資源
Ø 在通信時屬於主動地一方,需要事先知道服務端的IP地址和端口信息
4)         套接字
套接字可以理解爲通信連接的一端,其主要包括協議、主機IP地址和端口號,將兩個套接字連接到一起便可以再不同應用進程之間傳遞數據,因此套接字實現了對網絡和傳輸層協議的封裝,爲應用進程之間的通信連接的建立、數據傳輸等通信過程提供了編程界面,使用套接字進行通信示意圖爲:

5)         工作模型

2.         創建工程

文件à新建à項目

在模板中選中控制檯應用程序,輸入名稱後,單擊瀏覽選擇保存的位置,單擊確定,同樣的方法建立好客戶端的工程
3.         服務端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace server
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
               IPAddress Ip = IPAddress.Parse("127.0.0.1");
                //IPAddress提供網際協議地址的類,Parse將IP地址字符串轉換爲IPAddress的實例
                TcpListener TcpList = new TcpListener(Ip, 8888);
                //TcpListener網絡偵聽類,從TCP網絡客戶端偵聽連接,TcpListener (參數1,參數2),參數1表示本地IP地址,參數2表示用來偵聽傳入的端口連接
                TcpList.Start();
                //啓動對掛起連接數的傳入鏈接請求的偵聽
                Console.WriteLine(“Server start!”);
                Console.WriteLine(“Ip address:” + TcpList.LocalEndpoint);
                //LocalEndpoint獲取服務端(即本地)地址與端口等信息
                Console.WriteLine(“Wait”);
                Socket Soc = TcpList.AcceptSocket();
                //AcceptSocket表示接受掛起的連接請求,Socket爲套接字接口的類
                Console.WriteLine("Received Connection:" + Soc.RemoteEndPoint);
                //RemoteEndPoint獲取客戶端地址與端口等信息
                byte[] b = new byte[100];
                int k = Soc.Receive(b);
                //Soc.Receive(b)從socket接收數據,將數據存入接收緩衝區列表中,k的值爲該數據的長度
                Console.WriteLine(“Received data from client:”);
                for (int i = 0; i < k; i++)
                    Console.Write(Convert.ToChar(b[i]));
                    //Convert.ToChar(b[i])將數組b轉換基本數據類型爲char的類型並輸出
                ASCIIEncoding AS = new ASCIIEncoding();
                //ASCIIEncoding表示Unicode字符的ASCII字符編碼類
                Soc.Send(AS.GetBytes(“Received data!”));
                //Soc.Send向客戶端發送數據,AS.GetBytes()獲得括號中字符串的bytes值
                Soc.Close();
                //關閉連接並釋放所有關聯的資源
                TcpList.Stop();
                //關閉偵聽
                Console.ReadLine();
                //等待輸入,起到暫停的作用
            }
            catch(Exception e)
            {
                Console.WriteLine("Error!" + e.StackTrace);
                //獲取當前異常發生時調用堆棧上的幀的字符串
            }
        }
    }
}
4.         客戶端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Net.Sockets;
namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                TcpClient TcpClient = new TcpClient();
                //TcpClient爲TCP網絡服務提供客戶端連接的類
                TcpClient.Connect("127.0.0.1", 8888);
                //Connect方法使用指定的IP地址和端口號將客戶端連接到遠程TCP主機
                Console.WriteLine("Connect Complete");
                Console.WriteLine("Input string:");
                String str = Console.ReadLine();
                //定義字符串str變量,保存輸入的字符
                Stream stm = TcpClient.GetStream();
                //定義數據流,用於發送和接收數據
                ASCIIEncoding AS = new ASCIIEncoding();
                byte[] b = AS.GetBytes(str);
                //將字符串轉換爲byte類型
                stm.Write(b, 0, b.Length);
                //Write(參數1,參數2,參數3)表示向服務端發送字符串,參數1指將此數組複製到當前流,參數2指從零開始的字節偏移量,參數3指要寫入當前流的字節數(即字符串長度)
                Console.WriteLine("Send Complete");
                byte[] bb = new byte[100];
                int k = stm.Read(bb, 0, 100);
                //stm.Read在當前流中讀入服務端發來的響應信息,其參數與Write方法參數一致,k值爲讀入字符串的長度
                for (int i = 0; i < k; i++)
                    Console.Write(Convert.ToChar(bb[i]));
                TcpClient.Close();
                //釋放TcpClient實例,並不關閉基礎連接
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error!" + e.StackTrace);
            }
        }
    }
}
5.    測試

運行服務端,提示服務端已啓動,IP地址爲127.0.0.1,使用的端口爲8888,等待客戶端的連接

運行客戶端,提示連接服務端完成,等待輸入需發送的信息

客戶端運行後,在服務端上出現客戶端地址爲127.0.0.1,使用的端口爲2094

輸入信息hello後回車發送,提示發送完成,並收到由服務器發來的確認接收信息

服務器接收到來自客戶端發送的hello
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章