用C#编写一个命令行/控制台hello world程序
今天的实验任务是用C#编写一个命令行/控制台hello world程序,实现如下功能:在屏幕上连续输出50行“hello cqjtu!重交物联2018级”;同时打开一个网络UDP 套接字,向室友电脑或树莓派发送这50行消息。
1.打开虚机,并选择visual studio 2019创建一个C#控制台应用
写入下列代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string s = "hello cqjtu!重交物联2018级";
//因为下面要使用StringBuilder的Append函数
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 50; i++)
{
sb.Append(s);
}
//将StringBuilder转换为string,并写入
Console.WriteLine(sb.ToString());
//控制台显示
Console.ReadLine();
}
}
}
2.打开一个网络UDP 套接字,向室友电脑或树莓派发送这50行消息
窗口控件:
listBpx
textBox
button
label
实现功能:打开程序向另一台电脑发送上述helloworld程序打印的信息
UDP编程是面向无连接的,不需要在客户端和服务端之间建立连接
第一步,打开vs2017新建c#控制台项目项目udp_server,将udp_server中的Program.c中的代码替换为
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDP
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[1024];
//得到本机IP,设置TCP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8001);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
server.Bind(ip);
Console.WriteLine("This is a Server, host name is {0}", Dns.GetHostName());
//等待客户机连接
Console.WriteLine("Waiting for a client");
//得到客户机IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.Default.GetString(data, 0, recv));
//客户机连接成功后,发送信息
string welcome = "连接成功 ";
//字符串与字节数组相互转换
data = Encoding.Default.GetBytes(welcome);
//发送信息
server.SendTo(data ,Remote);
while (true)
{
data = new byte[1024];
//发送接收信息
//从客户机接受消息
recv = server.ReceiveFrom(data, ref Remote);
//将字节流信息转换为字符串
string Data = Encoding.Default.GetString(data, 0, recv);
//将字符串输出到屏幕上
Console.WriteLine(Data);
// Console.WriteLine(Encoding.Default.GetString(data, 0, recv));
/*
//定义字符串input
string input;
//读取屏幕上的字符串
input = Console.ReadLine();
if (input == "exit")
break;
//将input发送至客户机
server.SendTo(Encoding.Default.GetBytes(input),Remote);*/
}
server.Close();
}
}
}
关闭当前项目并新建c#控制台项目udp_client,将udp_client中的Program.c中的代码替换为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input;
//构建TCP 服务器
Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());
//设置服务IP,设置TCP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
//定义网络类型,数据连接类型和网络协议UDP
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string welcome = "连接成功!";
//字符串与字节数组相互转换
data = Encoding.Default.GetBytes(welcome);
//发送信息
client.SendTo(data,ip);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
//接受信息
int recv = client.ReceiveFrom(data, ref Remote);
//输出服务端ip
Console.WriteLine("Message received from {0}: ", Remote.ToString());
//输出接受到的信息
Console.WriteLine(Encoding.Default.GetString(data, 0, recv));
while (true)
{
//读取屏幕的字符串存入input中
input = Console.ReadLine();
if (input == "exit")
break;
//将input中的字符串发送至服务端
for (int i=0;i<50;i++)
{
client.SendTo(Encoding.Default.GetBytes(input), Remote);
}
/*
data = new byte[1024];
//将接受自服务端的信息存入recv中
recv = client.ReceiveFrom(data, ref Remote);
//将字节流转为字符串
string Data = Encoding.Default.GetString(data, 0, recv);
//将Date中的数据打印到屏幕上
Console.WriteLine(Data);*/
}
//输入exit后,屏幕打印下列字符串
Console.WriteLine("Stopping Client.");
//关闭服务端
client.Close();
}
}
}
用室友的电脑运行服务端,自己的电脑运行客户端,就可以实现单向的从客户端向服务端发送数据
接受效果如上图所示
三、安装wireshark 抓包软件,抓取上述程序发送的网络包,对数据帧结构进行分析。