使用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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

echarts 在两点之间画一条线_树的手绘很难画?分步骤教你画,简单易学,收藏起来临摹学习...

前景树——半树、角树画法半树与角树,在建筑手绘中常处于前景位置,其表现需尽量写意,形体概括,对比强烈,进而更好地引导与突出中景。(1)半树半树,顾名思义只需画出单棵树从树冠中下部…

上古卷轴5json文件修改_【白夜谈】我做了一款失败的《社长卷轴》Mod

文/Kong 题图 / CaesarZX白夜谈是编辑的自留地,聊一些比较个人的内容。但是对于我来说,这个栏目总是一个特别的苦差。因为我实在没有太多表达观点的欲望,所以我和负责白夜谈的跳跳老师商量,可不可以尝试搞个系列节目。比如&#x…

中音萨克斯指法表图_初学萨克斯一定要了解这6点基础知识

萨克斯管是一种色彩性很强的乐器,它的声音独特,带有神秘的色彩,音色十分迷人,是一种比较接近人声特点的乐器,因此吸引到越来越多的人喜欢上萨克斯。那么新手在初学阶段关于萨克斯一定要了解这6点基础知识。一、萨克斯管…

在哪里可以找水系图_虹吸雨水排水系统对比传统重力排水,好在哪里?

建筑物的排水系统是必不可少的,雨水的排水又是其重中之重的排水系统。雨水排水系统的选择我们需要考虑哪些因素呢?下面就介绍一下虹吸雨水排水系统相较于传统重力排水的优势到底在哪里?一、虹吸雨水排水系统原理形成原理:利用屋面…

ug编程内公差和外公差是什么_工厂老师傅自学数控编程多年心得,希望你们少走弯路...

需要UG资料可以关注私信 “UG"或者 ”UG教程 “领取。很多人都认为自学有恒心有耐心有定力就可以了,有这些意志还没有达到自学的水准,因为有很多东西你都不知道是有这回事的,或许你知道有这回事你根本解决不了,自学的满足条件…

加油站都需要什么手续_农村买房过户都需要什么手续?

一、农村房屋过户怎么办理? 根据我国法律的规定,办理农村房屋过户需要去乡或镇的国土所。农村房屋过户需要去乡镇国土所提出申请,提交相关材料后,当地国土所根据申请人提供的权属资料进行审查,实地进行勘丈、调查、公…

axi时序图_深入 AXI4总线(E3)实战:制作一个 AXI 接口 IP

本系列我想深入探寻 AXI4 总线。不过事情总是这样,不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章,让读者能和我一起深入探寻 AXI4。在本系列先前的文章中,我们首先通过协议 specification 了解协议的接…

动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...

下面介绍下求线段和最小值常见题型1,通过点关于直线对称点得到两定点之间直线段长度最短。以下题为例,已知矩形ABCD,AB8, AD6.E,F分别为AB,AD的中点。G,H分别为BC,AB上动点。求四边形…

番茄钟怎么调_学习神器-番茄钟

番茄钟番茄工作法是简单易行的时间管理方法。使用番茄工作法,选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事。直到番茄时钟响起,然后进行短暂休息一下(5分钟就行&…

获取某一条_想获取流量?这几种工具是必须要有的,能帮你获客快人一步!

2020年,最难的莫过于实体店了,而没有受到影响的,也就是那些互联网企业,一切企业甚至业绩比以前还好,不得不承认,互联网确实有它的独特之处。也因此,很多实体商家也在慢慢向互联网转变。为什么要…

排除jar_Gradle排除依赖关系

Gradle排除依赖关系在IDE中发现了C3P0的依赖,但是在build.gradle并没有手动导入,所以说某个jar包依赖了,在STS中没有像Maven可以直接查看依赖的窗口可以在命令行下查看整个项目的依赖关系gradle dependencies![[外链图片转存失败(img-v7CgoEk…

格式怎么转换_爱奇艺下载的视频怎么转换成常见的mp4格式?

虽说现如今在线观看视频已经很流畅了,只要网速在线,基本上不会出现画面卡顿的情况,但是仍然有不少小伙伴会将视频从各大平台中下载下来收看,这样,即便是没有联网,也不会影响视频播出。不知道大家在从爱奇艺…

分屏 取消_记录Android7.0以上手机开启分屏后活动的生命周期变化

真正的大师,总是怀着一颗学徒的心。大家好,我是小黑,一个还没秃头的程序员~~~如今,很多Android手机已经支持多屏任务了,也就是说你可以边追剧边回好友消息了,所以,今天的内容是记录Android7.0出…