使用udp协议实现服务器端程序时,用VisualC#实现UDP协议(二)

12.并以下面代码替换Form.cs中由系统产生的InitializeComponent过程。

private void InitializeComponent ( )

{

this.button1 = new System.Windows.Forms.Button ( ) ;

this.button2 = new System.Windows.Forms.Button ( ) ;

this.textBox1 = new System.Windows.Forms.TextBox ( ) ;

this.textBox2 = new System.Windows.Forms.TextBox ( ) ;

this.label1 = new System.Windows.Forms.Label ( ) ;

this.label2 = new System.Windows.Forms.Label ( ) ;

this.label3 = new System.Windows.Forms.Label ( ) ;

this.textBox3 = new System.Windows.Forms.TextBox ( ) ;

this.SuspendLayout ( ) ;

this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;

this.button1.Location = new System.Drawing.Point ( 128 , 128 ) ;

this.button1.Name = "button1" ;

this.button1.Size = new System.Drawing.Size ( 112 , 40 ) ;

this.button1.TabIndex = 0 ;

this.button1.Text = "获取" ;

this.button1.Click += new System.EventHandler ( this.button1_Click ) ;

this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;

this.button2.Location = new System.Drawing.Point ( 128 , 184 ) ;

this.button2.Name = "button2" ;

this.button2.Size = new System.Drawing.Size ( 112 , 40 ) ;

this.button2.TabIndex = 1 ;

this.button2.Text = "对时" ;

this.button2.Click += new System.EventHandler ( this.button2_Click ) ;

this.textBox1.Location = new System.Drawing.Point ( 120 , 56 ) ;

this.textBox1.Name = "textBox1" ;

this.textBox1.Size = new System.Drawing.Size ( 200 , 21 ) ;

this.textBox1.TabIndex = 2 ;

this.textBox1.Text = "" ;

this.textBox2.Location = new System.Drawing.Point ( 120 , 88 ) ;

this.textBox2.Name = "textBox2" ;

this.textBox2.Size = new System.Drawing.Size ( 200 , 21 ) ;

this.textBox2.TabIndex = 3 ;

this.textBox2.Text = "" ;

this.label1.Location = new System.Drawing.Point ( 48 , 56 ) ;

this.label1.Name = "label1" ;

this.label1.TabIndex = 4 ;

this.label1.Text = "本地时间:" ;

this.label2.Location = new System.Drawing.Point ( 40 , 88 ) ;

this.label2.Name = "label2" ;

this.label2.Size = new System.Drawing.Size ( 88 , 24 ) ;

this.label2.TabIndex = 5 ;

this.label2.Text = "服务器时间:" ;

this.label3.Location = new System.Drawing.Point ( 16 , 24 ) ;

this.label3.Name = "label3" ;

this.label3.Size = new System.Drawing.Size ( 112 , 23 ) ;

this.label3.TabIndex = 6 ;

this.label3.Text = "设定服务器地址:" ;

this.textBox3.Location = new System.Drawing.Point ( 120 , 24 ) ;

this.textBox3.Name = "textBox3" ;

this.textBox3.Size = new System.Drawing.Size ( 200 , 21 ) ;

this.textBox3.TabIndex = 7 ;

this.textBox3.Text = "" ;

this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;

this.ClientSize = new System.Drawing.Size ( 352 , 245 ) ;

this.Controls.AddRange ( new System.Windows.Forms.Control[] {

this.textBox3 ,

this.textBox2 ,

this.textBox1 ,

this.button2 ,

this.button1 ,

this.label1 ,

this.label2 ,

this.label3} ) ;

this.MaximizeBox = false ;

this.Name = "Form1" ;

this.Text = "UDP对时客户端" ;

this.ResumeLayout ( false ) ;

}

至此【UDP对时客户端】项目的界面设计和程序功能实现的前期工作就基本完成了,其设计界面如图03所示:

4df8c7e63c3fd41aaf90144f1b1c33fd.png

图03:【UDP对时客户端】项目的设计界面

13.在Form1.cs中的InitializeComponent过程之后,添加下列代码,下列代码的功能是在程序中导入WinAPI函数——SetSystemTime,这个函数位于文件Kernel32.dll。程序就是通过此函数来更正系统时间的。

[ DllImport ( "Kernel32.dll" )]

private static extern bool SetSystemTime ( SystemTime time ) ;

//引入API函数

14.并把它添加到在导入WinAPI函数代码之后,再添加下列代码,下列代码是定义“start_client”过程。此过程的功能是向服务器端传送对时请求,并获取从服务器端反馈来的时间日期数据。

{

client = new UdpClient ( port ) ;

IPAddress a = IPAddress.Parse ( "127001" ) ;

receivePoint = new IPEndPoint ( a , port ) ;

IPAddress HostIP ;

bool continueLoop = true ;

while ( continueLoop )

{

string hostName = Dns.GetHostName ( ) ;

System.Text.ASCIIEncoding encode

= new System.Text.ASCIIEncoding ( ) ;

//定义发送到服务器端的请求信息

//请求信息是一个字符串,为客户端名称和接收服务器反馈信息的端口号组成的字符串

string sendString = hostName + "/" + port.ToString ( ) ;

byte[] sendData = encode.GetBytes ( sendString ) ;

//判断使用者输入的是IP地址还是计算机名称

try

{

HostIP = IPAddress.Parse ( textBox3.Text ) ;

}

catch

{

//如果输入的是计算机名称,则按照执行下列代码。

//发送请求信息

client.Send ( sendData , sendData.

Length , textBox3.Text , 8080 ) ;

//接收来自服务器端的信息

byte[] recData =

client.Receive ( ref receivePoint ) ;

timeString = encode.GetString ( recData ) ;

client.Close ( ) ;

continueLoop=false ;

return ;

}

//输入的是IP地址,则执行下列代码

IPEndPoint host = new IPEndPoint ( HostIP ,8080 ) ;

//发送请求信息

client.Send ( sendData , sendData.Length , host ) ;

//接收来自服务器端的信息

byte[] recData1 = client.Receive ( ref receivePoint ) ;

//获取服务器端的时间和日期

timeString = encode.GetString ( recData1 ) ;

client.Close ( ) ;

//退出循环

continueLoop=false ;

}

}

如果“start_client”过程正确调用,就把服务器端的时间和日期保存到timeString字符串中了。

17.用下列代码替换Form1.cs中button1的“Click”事件的处理代码。下列代码的功能是调用“start_client”过程,获取并显示服务器端程序的时间和日期信息。

private void button1_Click ( object sender , System.EventArgs e )

{

start_client ( ) ;

textBox1.Text = DateTime.Now.ToString ( ) ;

//显示客户端当前时间和日期

textBox2.Text = timeString ;

//显示服务器当前时间和日期

}

18.用下列代码替换Form1.cs中button2的“Click”事件对应的处理代码。下列代码的功能是根据获取的服务器时间和日期数据来更正客户端时间和日期。

private void button2_Click ( object sender , System.EventArgs e )

{

start_client ( ) ;

//把接收来的数据转换时间日期格式

try

{

temp = DateTime.Parse ( timeString ) ;

}

catch

{

MessageBox.Show ( "错误时间" ) ;

return ;

}

//根据得到的时间日期,来定义时间、日期

SystemTime st= new SystemTime ( ) ;

st.year= ( short )temp.Year ;

st.Month= ( short )temp.Month ;

st.DayOfWeek= ( short )temp.DayOfWeek ;

st.Day= ( short )temp.Day ;

st.Hour=Convert.ToInt16 ( temp.Hour ) ;

if ( st.Hour>=12 )

{

st.Hour-= ( short )8 ;

}

else if ( st.Hour >= 8 )

{

st.Hour-= ( short )8 ;

}

else

{

st.Hour+= ( short )16 ;

}

st.Minute=Convert.ToInt16 ( temp.Minute ) ;

st.Second=Convert.ToInt16 ( temp.Second ) ;

st.Milliseconds=Convert.ToInt16 ( temp.Millisecond ) ;

//修改本地端的时间和日期

if ( SetSystemTime ( st ) )

{

MessageBox.Show ( DateTime.Now.ToString ( ) ,"修改成功" ) ;

}

else

MessageBox.Show ( "不成功!" ,"不成功" ) ;

}

至此,在正确完成上述步骤,全部保存后,【网络对时客户端】项目的全部工作就完成了。

六.运行基于UDP协议网络对时系统,实现网络对时:

首先要确认确认网络对时系统中的服务器端程序已经运行和其IP地址或主机名。然后在客户机上运行网络对时系统中的客户端程序,在正确输入运行网络对时系统服务器端程序对应的主机名或者IP地址后,单击客户端程序中【获取】按钮,则在程序的文本框中显示服务器当前时间和日期和客户端当前的时间和日期。若发现二种存在差异,单击【对时】按钮,则将以服务器当前时间和日期来修正客户机的时间和日期。修改成功则弹出【修改成功】提示框,反之则弹出【不成功】提示框,图04是【UDP对时客户端】项目根据服务器端当前时间和日期信息成功更改本地时间和日期后的界面:

652120eec8c533439f88b08c54b74704.png

图04:【UDP对时客户端】项目的运行界面

七.总结:

本文详细介绍了UDP协议,.Net FrameWork SDK提供给Visual C#用以操作UDP协议的主要类库,以及通过一个具体而使用的示例——实现一个网络对时系统,介绍在Visual C#实现UDP协议的具体方法和过程。UDP由于其自身的缺点注定在某些领域无法利用它,但在可以利用它的领域,UDP以其快捷、简单、实用的特点正在受到更多程序员的欢迎。尤其在现代,网络运行态势越来越好的情况下,可以预见的是UDP在网络中的应用情景将更广阔。希望本文的内容对您掌握用Visual C#编写基于UDP的网络应用程序有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

circlegan_CycleGAN原理以及代码全解析

许多名画造假者费尽毕生的心血,试图模仿出艺术名家的风格。如今,CycleGAN就可以初步实现这个神奇的功能。这个功能就是风格迁移,比如下图,照片可以被赋予莫奈,梵高等人的绘画风格这属于是无配对数据(unpaired)产生的图…

魅族16无信号服务器,魅族16信号差的解决办法

手机信号问题一直都是人们关注的问题,在日常使用时有些地方手机可能出现突然信号变差,可能别人的手机信号一直很好只有你的出现了问题。魅族手机最早的几个版本都很容易出现这种问题,新款的魅族16怎么样呢?魅族16信号差怎么解决呢…

服务器系统核心和带gui区别,Windows Server 2012图形用户界面(GUI)和服务器核心(Server Core)之间的切换...

当安装 Windows Server 2012 时,咱们能够在“服务器核心安装”和“彻底安装”之间任选其一。“带 GUI 选项的服务器”选项Windows Server 2012 等效于 Windows Server 2008 R2 中的彻底安装选项。“服务器核心安装”选项可减小所需的磁盘空间、潜在的***面&#xff…

用python控制键盘_【python黑科技-pyautogui】教你用python控制滑鼠与键盘

今天来聊聊python中非常酷炫的功能,控制滑鼠与键盘,理论上,如果你程序功力非常强的话,甚至可以用这个模组写出一个「游戏插件」,让程序操控你的滑鼠与键盘帮你玩游戏本文测试环境: anaconda, spyder, python3.7安装pya…

ulimit限制 新系统_Linux查看及修改系统的资源限制命令ulimit

在Linux,查看系统对资源使用的显示可以使用命令ulimit,其中参数-a会列出所有的资源使用限制。[demoserver ~]$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimite…

华为策略路由加等价路由_华为——防火墙——策略路由配置及思路

华为——策略路由(校园网配置)作用:通过分析数据报的源地址和目标地址,按照策略规则选择不同的网关,进行数据转发。提供冗余,负载,但是还是单线路的速度。只是提供了不同的方向,并没有进行合并线路。拓扑图…

简述数学建模的过程_中文字幕乱码文字2020_MDTM-198加勒比中文字幕合集 - 第5页...

Well, you won’t get one from me.Nah, I never let a lady treat.I try to ease away and create a larger space cushion, but he steps toward me again. I don’t feel threatened by him, however. He’s a big guy, but not menacing. He isn’t trying to bully me wit…

头条自己提问的问题在哪看_在头条的这三十天

文、图:书海履痕今天入头条三十天,按民间俗语,满月了。 三十个日子,真得是感慨万千。特别是昨日的文章,经头条君和各位友友们的厚爱,让我经历了过山车的感觉,各种滋味存于心底,在此谢…

c可以 char* 赋值但是c++不可以_雷佳音的妻子完全可以女团C位出道,这么有气质的女人,谁能不爱...

导读:雷佳音的妻子完全可以女团C位出道,这么有气质的女人,谁能不爱各位点开这篇文章的朋友们,想必都是很高的颜值吧,我们真的是很有缘哦,小编每天都会给大家带来不一样的汽车资讯,如果对小编的文…

【加解密学习笔记:第一天】操作系统基础知识

加解密相关系统基础知识 Unicode编码格式 Unicode编码中使用2字节对字符进行编码,对ASCLL码的支持通过愿为不变,高位补零实现一个字有2字节,Intel在存入储存器时低位入低地址,高位入高地址(Little-endian&#xff09…

oracle sequence 不同 会话 不连续_序列 Sequence

Sequence是一个数据库对象,多个用户可以从中生成唯一的整数,可以使用序列自动生成主键值。生成序列号时,序列号将递增,独立于事务提交或回滚;如果两个用户同时递增同一序列,因为序列号是由另一个用户生成的&#xff0c…

【加解密学习笔记:第二天】动态调试工具OllyDbg使用基础介绍

首先说一下OllyDbg的界面,如下图所示 下面依次介绍: 反汇编面板:有四列,从左到右依次为:地址(Address),机器码(Hex dump),反汇编代码&#xff08…

dmp只导数据不导结构_今日头条快消食品推广CVR为何高达4.40%?原来DMP定向这么好...

摘要:据艾媒报告显示,当前快消品消费在中国居民消费的比重已经占到34.6%,无疑是一支重要力量。虽然消费者的消费能力在不断提升,但快消行业的推广仍多受制于传统模式,应该怎么寻找出路呢?一、企业介绍客户L…

【加解密学习笔记:第三天】OllyDbg断点介绍

INT 3 断点 常用断点,使用“F2”快捷键设置的就是 INT 3 断点。这类断点采用修改机器码的方式,将设断处的代码更改为 “CC”,当程序运行至设断处时,会抛出一个异常,OllyDbg会捕捉到这个异常,使得程序暂停&a…

c# 十六进制转为字节_C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制Console.WriteLine("十进制166的二进制表示: "Convert.ToString(166, 2));//十进制转八进制Console.WriteLine("十进制166的八进制表示: "Convert.ToString(166, 8));//十进制转…

SHA-1算法详解和C++实现

SHA-1算法详解和C实现 背景介绍 SHA-1算法也称安全散列算法1,可以将一个最大264−12^{64}-1264−1的数据生成一个160位的数据摘要。尽管SHA-1算法已经被认为不再安全,但仍有部分应用使用SHA-1算法验证文件。 算法原理 类型定义 在介绍算法原理之前&…

python的socket模块_python模块:socket模块

1.Socket类型socket(family,type[,protocal]) 使用给定的地址族,套接字类型,协议编号(默认是0)来创建套接字socket类型描述socket.AF_UNIX只能够用于单一的Unix系统进程间通信socket.AF_INET服务器之间网络通信socket.AF_INET6IPv6socket.SOCK_STREAM流式socket , for TCPs…

完整性校验用到常见的算法_校验数据的完整性,校验数据完整性,使用MD5/SHA算法校...

校验数据的完整性,校验数据完整性,使用MD5/SHA算法校使用MD5/SHA算法校验数据的完整性package cn.itcast.gz;import java.io.File;import java.io.FileInputStream;import java.security.DigestInputStream;import java.security.MessageDigest;/** * 主要用于验证数…

python超市买苹果_官网购买的iPhone12pro还没发货?试着用Python快速入手

引言​iPhone12pro有望成为2020年末真香机,动辄3000元的溢价让不少消费者选择了等待官网调货。除了官方与电商线上平台,苹果还采用了线下预约制提货。但每天少的可怜的出货量,和不到一秒钟就抢空的预约名额让“老年人”手速的各位望而却步。传…

server多列转行 sql_sql server 行转列及列转行的使用

在我们使用的数据库表中经常需要用到行列互相转换的情况,使用sql 的关键词 UNPIVOT(列转行)和PIVOT(行转列)可轻松实现行列转换。一、列转行:员工月份排班表存储是采用1号~31号作为列的方式进行存储的现通过 UNPIVOT 将每天的班次用行进行展示&#xff0…