初識C#網路程式設計

在下摸魚怪發表於2020-10-31

一、用C#編寫客戶端(Client)

a. 開啟 VS2017 新建一個 C# 的控制檯程式

初識C#網路程式設計

b. 將解決方案中的 Program.cs 重新命名為 Client.cs

c.Client.cs 中寫入如下內容:

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

namespace ConsoleApp1
{
    class Client
    {
        static void Main(string[] args)
        {
            for(int i = 0; i < 50; i++)
            {
                Console.WriteLine("木葉飛舞之處,火亦生生不息!!!");
            }
            // 建立一個UdpClient物件,0表示系統自動分配傳送埠
            UdpClient udpSender = new UdpClient(0);
            // 連線到服務端並指定接收埠
            udpSender.Connect("伺服器公網IP", 5000);
            for(int i = 0; i < 50; i++)
            {
                // 編碼格式為 utf-8
                byte[] sendBytes = Encoding.UTF8.GetBytes("木葉飛舞之處,火亦生生不息!!!");
                // 把訊息轉換成位元組流傳送到服務端
                udpSender.Send(sendBytes, sendBytes.Length);
            }
            byte[] over = Encoding.UTF8.GetBytes("stop");
            udpSender.Send(over, over.Length);
            // 按任意鍵退出
            Console.ReadKey();
        }
    }
}

注意將 udpSender.Connect(“伺服器公網IP”, 5000) 中的 伺服器公網IP 換成自己的 IP 地址,如果是本地測試的話,只需換成 localhost 即可

二、配置服務端(Server)

伺服器我選用的是阿里雲的輕量應用伺服器,因為租用的時間還沒有到期,正好可以用來做這次實驗?

伺服器系統選用的是:Ubuntu18.04

a. 首先進入輕量應用伺服器管理控制平臺,然後遠端連線

b. 環境的配置

這裡的服務端選用的是 Python 實現的,原因是配置簡單,還有就是 C#Linux 的支援沒有對 Windows 的那麼好

  1. python 版本的檢視(一般預設的是python2的版本)

    python --version
    pip --version
    python3 --version # 檢視python3的版本
    
  2. 安裝 python3-pip

    sudo apt-get update
    sudo apt-get install python3-pip
    
  3. 將預設的 python(python2)版本更改為 python3 版本

    sudo rm /usr/bin/python  # 刪除預設的python連結
    sudo ln -s /usr/bin/python3.6 /usr/bin/python  # 新建python連結指向python3版本
    

    注意:我的 python3 的版本為 3.6,這裡需換成自己的 python3 版本。

    然後再次用 –version 檢視版本資訊,會發現已經更改為 python3 的資訊

    然而,用 pip --version 檢視版本資訊時也許會報 ModuleNotFoundError: No module named ‘pip._internal’ 的錯

    解決辦法:

    sudo vim /usr/local/bin/pip
    

    from pip._internal import main 改成 from pip import main

    初識C#網路程式設計

    修改後,再次檢視資訊:

    初識C#網路程式設計
  4. home 目錄下,新建一個 test 文夾,並在該資料夾中新建 Server.py

    cd ~
    mkdir test
    cd test
    sudo vim Server.py
    

    並寫入如下內容:

    from socket import *
    
    # 建立套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    # ip地址和埠號,ip一般不用寫,表示本機的任何一個ip
    local_addr = ('', 5000)
    udp_socket.bind(local_addr)
    print("等待連線")
    while True:
        # 等待接收對方傳送的資料,1024表示能接收的最大位元組數
        recv_data = udp_socket.recvfrom(1024)
        recv_result = recv_data[0].decode('utf-8')
        if recv_result == 'stop':
             print("連線已斷開")
             break
        print(recv_result)
    udp_socket.close()
    

c. 測試

先執行服務端(Server),然後在執行客戶端(Client)

在執行服務端之前需要先開啟 5000 埠,在控制檯中操作如下:

初識C#網路程式設計

執行服務端:

初識C#網路程式設計

執行客戶端,並檢視服務端是否接收資料

初識C#網路程式設計

三、用C#編寫一個簡單的Form視窗程式

a. 建立一個 Windows 窗體應用(.NET Framework) 專案

初識C#網路程式設計

如果沒有需要重新安裝一下

勾選 .NET 桌面開發 中如下選項:

初識C#網路程式設計

b. 設計 Form1 窗體如下

初識C#網路程式設計

c. 修改 Form.cs

  1. 引入如下標頭檔案:

    using System.Net.Sockets;
    
  2. 修改 button1_Click 函式如下:

    private void button1_Click(object sender, EventArgs e)
    {
        UdpClient udpSender = new UdpClient(0);
        udpSender.Connect("39.106.160.34", 5000);
        string message = textBox1.Text;
        byte[] sendBytes = Encoding.UTF8.GetBytes(message);
        udpSender.Send(sendBytes, sendBytes.Length);
    }
    

d. 測試

初識C#網路程式設計

四、通過 wireshark抓包,對資料幀進行分析

Ethernet II, Src: 資料鏈路層乙太網幀頭部資訊

初識C#網路程式設計

Internet Protocol Version 4, Src: 網際網路層IP包頭部資訊

初識C#網路程式設計

五、參考?:

相關文章