初识C#网络编程

一、用C#编写客户端(Client)

a. 打开 VS2017 新建一个 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

    修改后,再次查看信息:

  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#编写一个简单的Form窗口程序

a. 创建一个 Windows 窗体应用(.NET Framework) 项目

如果没有需要重新安装一下

勾选 .NET 桌面开发 中如下选项:

b. 设计 Form1 窗体如下

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. 测试

四、通过 wireshark抓包,对数据帧进行分析

筛选出 UDP 数据包

Ethernet II, Src: 数据链路层以太网帧头部信息

Internet Protocol Version 4, Src: 互联网层IP包头部信息

User Datagram Protocol:UDP协议

每个报头字段为 2字节,因此 UDP 报头为 8字节数据报长度 = 报头长度(8字节) + 报文长度(48字节) = 56字节

Data:数据包

五、参考🔗:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值