博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第七周作业--C#编程和网络编程入门
阅读量:2085 次
发布时间:2019-04-29

本文共 11668 字,大约阅读时间需要 38 分钟。

C#编程和网络编程入门

用C#编写一个命令行/控制台hello world程序

用C#编写一个命令行/控制台hello world程序

  • 创建一个c#控制台应用
    在这里插入图片描述
  • 写入源代码
    客户端代码
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace Client{
class Program {
static void Main(string[] args) {
//提示信息 Console.WriteLine("按下任意按键开始发送..."); Console.ReadKey(); int m; //做好链接准备 UdpClient client = new UdpClient(); //实例一个端口 IPAddress remoteIP = IPAddress.Parse("10.60.189.252"); //这个IP是我室友的电脑 int remotePort = 11000; //设置端口号 IPEndPoint remotePoint = new IPEndPoint(remoteIP, remotePort); //实例化一个远程端点 for (int i = 0; i < 50; i++) {
//要发送的数据:第n行:hello cqjtu!重交物联2018级 string sendString = null; sendString += "第"; m = i + 1; sendString += m.ToString(); sendString += "行:hello cqjtu!重交物联2018级"; //定义发送的字节数组 //将字符串转化为字节并存储到字节数组中 byte[] sendData = null; sendData = Encoding.Default.GetBytes(sendString); client.Send(sendData, sendData.Length, remotePoint);//将数据发送到远程端点 } client.Close();//关闭连接 //提示信息 Console.WriteLine(""); Console.WriteLine("数据发送成功,按任意键退出..."); System.Console.ReadKey(); } }}

服务器代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.Sockets;using System.Net;namespace server{
class Program {
static void Main(string[] args) {
UdpClient udpRec = new UdpClient(8888); Console.WriteLine("服务器已开启!"); try {
while (true) {
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] recBytes = udpRec.Receive(ref remoteIpEndPoint); string returnData = Encoding.Default.GetString(recBytes); Console.WriteLine("接收到的数据是:" + returnData); } } catch (Exception e) {
Console.WriteLine(e); } finally {
udpRec.Close(); } } }}
  • 运行结果
    客户端
    在这里插入图片描述
    服务器

在这里插入图片描述

二.用VS2015的C#编写一个简单的Form窗口程序,有一个文本框 textEdit和一个发送按钮button,运行程序后,可以在文本框里输入文字

  • 创建一个新的项目
    在这里插入图片描述
  • 代码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading;namespace frame_udp_server{
public partial class Form1 : Form {
private UdpClient receiveUdpClient;//接收用 private UdpClient sendUdpClient;//发送用 private const int port = 65530;//和本机绑定的端口号 IPAddress ip=IPAddress.Parse("192.168.43.167");//本机ip IPAddress remoteip=IPAddress.Parse("192.168.43.208");//远程主机ip public Form1() {
InitializeComponent(); CheckForIllegalCrossThreadCalls = false; //获取本机可用IP地址 IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress ipa in ips) {
if (ipa.AddressFamily == AddressFamily.InterNetwork) {
ip = ipa; break; } } //为了在同一台机器调试,此IP也作为默认远程IP //remoteip = ip; } private void Form1_Load(object sender, EventArgs e) {
//创建一个线程接收远程主机发来的信息 Thread myThread = new Thread(ReceiveData); myThread.IsBackground = true; myThread.Start(); } //接收数据 private void ReceiveData() {
IPEndPoint local = new IPEndPoint(ip, port); receiveUdpClient = new UdpClient(local); IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); while (true) {
try {
//关闭udpClient 时此句会产生异常 byte[] receiveBytes = receiveUdpClient.Receive(ref remote); string receiveMessage = Encoding.Unicode.GetString( receiveBytes, 0, receiveBytes.Length); listBox1.Items.Add("收到的消息:" + receiveMessage); } catch {
break; } } } //点击发送按钮发送数据 private void button1_Click(object sender, EventArgs e) {
//remoteip = IPAddress.Parse(txt_IPAddress.Text); Thread myThread = new Thread(SendMessage); myThread.IsBackground = true; myThread.Start(textBox2.Text); } //发送消息 private void SendMessage(object obj) {
string message = (string)obj; sendUdpClient = new UdpClient(0); byte[] bytes = Encoding.Unicode.GetBytes(message); IPEndPoint iep = new IPEndPoint(remoteip, port); try {
sendUdpClient.Send(bytes, bytes.Length, iep); listBox1.Items.Add("发送的消息:" + message); textBox2.Clear(); } catch (Exception ex) {
listBox1.Items.Add("发送出错:" + ex.Message); } } delegate void AddItemDelegate(ListBox listbox, string text); private void AddItem(ListBox listbox, string text) {
if (listbox.InvokeRequired) {
AddItemDelegate d = AddItem; //Control.Invoke 方法 (Delegate, Object[]): //在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。 listbox.Invoke(d, new object[] {
listbox, text }); } else {
//Add:动态的添加列表框中的项 listbox.Items.Add(text); //SelectedIndex属性获取单项选择ListBox中当前选定项的位置 //Count:列表框中条目的总数 listbox.SelectedIndex = listbox.Items.Count - 1; //调用此方法等效于将 SelectedIndex 属性设置为-1。 //可以使用此方法快速取消选择列表中的所有项。 listbox.ClearSelected(); } } delegate void ClearTextBoxDelegate(); private void ClearTextBox() {
if (textBox2.InvokeRequired) {
ClearTextBoxDelegate d = ClearTextBox; textBox2.Invoke(d); } else {
textBox2.Clear(); textBox2.Focus(); } } private void label2_Click(object sender, EventArgs e) {
} private void label2_Click_1(object sender, EventArgs e) {
} }}```- 结果using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading;namespace frame_udp_server{
public partial class Form1 : Form {
private UdpClient receiveUdpClient;//接收用 private UdpClient sendUdpClient;//发送用 private const int port = 65530;//和本机绑定的端口号 IPAddress ip=IPAddress.Parse("192.168.43.167");//本机ip IPAddress remoteip=IPAddress.Parse("192.168.43.208");//远程主机ip public Form1() {
InitializeComponent(); CheckForIllegalCrossThreadCalls = false; //获取本机可用IP地址 IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress ipa in ips) {
if (ipa.AddressFamily == AddressFamily.InterNetwork) {
ip = ipa; break; } } //为了在同一台机器调试,此IP也作为默认远程IP //remoteip = ip; } private void Form1_Load(object sender, EventArgs e) {
//创建一个线程接收远程主机发来的信息 Thread myThread = new Thread(ReceiveData); myThread.IsBackground = true; myThread.Start(); } //接收数据 private void ReceiveData() {
IPEndPoint local = new IPEndPoint(ip, port); receiveUdpClient = new UdpClient(local); IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); while (true) {
try {
//关闭udpClient 时此句会产生异常 byte[] receiveBytes = receiveUdpClient.Receive(ref remote); string receiveMessage = Encoding.Unicode.GetString( receiveBytes, 0, receiveBytes.Length); listBox1.Items.Add("收到的消息:" + receiveMessage); } catch {
break; } } } //点击发送按钮发送数据 private void button1_Click(object sender, EventArgs e) {
//remoteip = IPAddress.Parse(txt_IPAddress.Text); Thread myThread = new Thread(SendMessage); myThread.IsBackground = true; myThread.Start(textBox2.Text); } //发送消息 private void SendMessage(object obj) {
string message = (string)obj; sendUdpClient = new UdpClient(0); byte[] bytes = Encoding.Unicode.GetBytes(message); IPEndPoint iep = new IPEndPoint(remoteip, port); try {
sendUdpClient.Send(bytes, bytes.Length, iep); listBox1.Items.Add("发送的消息:" + message); textBox2.Clear(); } catch (Exception ex) {
listBox1.Items.Add("发送出错:" + ex.Message); } } delegate void AddItemDelegate(ListBox listbox, string text); private void AddItem(ListBox listbox, string text) {
if (listbox.InvokeRequired) {
AddItemDelegate d = AddItem; //Control.Invoke 方法 (Delegate, Object[]): //在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。 listbox.Invoke(d, new object[] {
listbox, text }); } else {
//Add:动态的添加列表框中的项 listbox.Items.Add(text); //SelectedIndex属性获取单项选择ListBox中当前选定项的位置 //Count:列表框中条目的总数 listbox.SelectedIndex = listbox.Items.Count - 1; //调用此方法等效于将 SelectedIndex 属性设置为-1。 //可以使用此方法快速取消选择列表中的所有项。 listbox.ClearSelected(); } } delegate void ClearTextBoxDelegate(); private void ClearTextBox() {
if (textBox2.InvokeRequired) {
ClearTextBoxDelegate d = ClearTextBox; textBox2.Invoke(d); } else {
textBox2.Clear(); textBox2.Focus(); } } private void label2_Click(object sender, EventArgs e) {
} private void label2_Click_1(object sender, EventArgs e) {
} }}
  • 结果
    在这里插入图片描述

三、安装wireshark 抓包软件,抓取上述程序发送的网络包,对数据帧结构进行分析。

  • 1.打开wireshark进行抓包
    (1)从跟踪中选择一个 UDP 数据包。从此数据包中,确定 UDP 标头中有多少字段,并为这些字段命名,抓取一个包
    在这里插入图片描述
  • 2.分析UDP数据包的格式
    UDP 的标头有 4 个字段,一共 8 byte,各字段分别为:
    Source Port:源端口号
    Destination Port:目的端口号
    Length:长度
    Checksum:校验和在这里插入图片描述

四、总结

太好了,真不错,下次还来

转载地址:http://bivqf.baihongyu.com/

你可能感兴趣的文章
Java 8系列之重新认识HashMap
查看>>
HashMap 、 ArrayList、String 重写了equals方法 而Object类(比如User)没有重写
查看>>
Servlet的生命周期
查看>>
Object中的getClass()返回的是当前运行的类
查看>>
加载驱动程序的方法
查看>>
深入理解java异常处理机制
查看>>
object类的基本方法
查看>>
回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议
查看>>
Dubbo分布式服务框架入门(附工程)
查看>>
两年Java开发工作经验面试总结
查看>>
作为Java面试官--谈谈一年来的面试总结
查看>>
两年Java程序员面试经
查看>>
面试心得与总结---BAT、网易、蘑菇街
查看>>
如何面试有2年java工作经验的应聘人员
查看>>
Java实现简单的递归操作
查看>>
Java实现简单的递归操作
查看>>
Struts2工作原理和执行流程图
查看>>
在线预览Word,Excel~
查看>>
hibernate延迟加载(get和load的区别)
查看>>
关于文件拷贝效率问题
查看>>