计算机网络课程设计利用java实现UDP协议.docx

上传人:b****1 文档编号:3555303 上传时间:2023-05-06 格式:DOCX 页数:21 大小:100.32KB
下载 相关 举报
计算机网络课程设计利用java实现UDP协议.docx_第1页
第1页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第2页
第2页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第3页
第3页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第4页
第4页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第5页
第5页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第6页
第6页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第7页
第7页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第8页
第8页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第9页
第9页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第10页
第10页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第11页
第11页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第12页
第12页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第13页
第13页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第14页
第14页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第15页
第15页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第16页
第16页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第17页
第17页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第18页
第18页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第19页
第19页 / 共21页
计算机网络课程设计利用java实现UDP协议.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算机网络课程设计利用java实现UDP协议.docx

《计算机网络课程设计利用java实现UDP协议.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计利用java实现UDP协议.docx(21页珍藏版)》请在冰点文库上搜索。

计算机网络课程设计利用java实现UDP协议.docx

计算机网络课程设计利用java实现UDP协议

:

匕気"栄秦皇岛分校

NorthEasternUniversityAtQinHuangDao

计算机网络课程设计

利用java实现UDP协议

系另

计算机与通信工程学院

专业

计算机科学与技术

学号

4110415

姓名

张振

指导教师

王聪

2014年7月4日

1.需求分析

程序是如何通过网络进行相互通信的呢?

各个孤立的工作站或主机用物理链路相连在一起,组成数据链路,从而达到资源共享和通信的目的,就形成网络。

通信是人与人之间同过某种媒体进行的信息交流与传递。

网络通信一般指网络协议。

当今网络协议有很多,其中基本最常用的就是TCP/IP协议族。

UDP协议就是属于TCP/IP协议族中的协议。

在网络中它与TCP协议一样用于处理数据包。

在OSI模型中,UDP协议在第四层一一传输层,处于IP协议的上一层。

与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

本文利用Java语言网络编程的思想,编写UDP协议程序,实现UDP协议在网络中所要完成的功能。

在Java语言为实现程序的相互通信提供了许多有用的抽象应用程序接口(API,ApplicationProgrammingInterface),这类应

用程序接口被称为套接字(sockets)。

因此,本文UDP协议的编程所需要用到的接口就是套接字。

2.实验环境

开发环境:

个人PC+win8.1+myeclipse10

3.实验原理以及相关内容

3.1UDP简介

UDP是UserDatagramProtocol的简称,中文全称是用户数据包协议,是一种

无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

在网络中它与TCP

协议一样用于处理数据包。

在OSI模型中,UDP协议在第四层一一传输层,处于IP协

议的上一层。

与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的

缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

UDP用来支

持那些需要在计算机之间传输数据的网络应用。

包括网络视频会议系统在内的众多的客

户/服务器模式的网络应用都需要使用UDP协议。

3.2使用UDP原因

UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协

议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协

议。

这是因为UDP有以下特点:

(1)UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送

时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

(2)由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

(3)UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

(4)吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、

源端和终端主机性能的限制。

(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的

链接状态表(这里面有许多参数)。

(6)UDP是面向报文的。

发送方的UDP对应用程序交下来的报文,在添加首部

后就向下交付给IP层。

既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

3.3UDP套接字

UDP协议提供了一种不同于TCP协议的端到端服务。

实际上UDP协议只实现两个功能:

(1).在IP协议的基础上添加了另一层地址(端口);

(2).对数据传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数

据。

由于其简单性,UDP套接字具有一些与我们之前所看到的TCP套接字不同的特征。

例如,UDP套接字在使用前不需要进行连接。

TCP协议与电话通信相似,而UDP协

议则与邮件通信相似:

你寄包裹或信件时不需要进行“连接”,但是你得为每个包裹和信件指定目的地址。

类似的,每条信息(即数据报文,datagram)负载了自己的地址

信息,并与其他信息相互独立。

在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。

一旦被创建,UDP套接字就可以用来

连续地向不同的地址发送信息,或从任何地址接收信息。

UDP套接字与TCP套接字的另一个不同点在于他们对信息边界的处理方式不同:

UDP套接字将保留边界信息。

这个特性使应用程序在接受信息时,从某些方面来说比使用TCP套接字更简单。

最后一个不同点是,UDP协议所提供的端到端传输服务是尽

力而为(best-effort)的,即UDP套接字将尽可能地传送信息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部门寄信一样)。

因此,使用了UDP套接字的程序必须准备好处理信息的丢失和重排。

4.实验内容

4.1流程图

UDP应用程序原理图

 

服勢器端

客户端

UDP应用程序流程图

——

发送

4.2实例解析

3.3.1UDP服务器端

UDP服务器要执行以下三步:

 

(1).创建一个DatagramSocket实例,指定本地端口号,并可以选择指定本地地址。

此时,服务器已经准备好从任何客户端接收数据报文。

(2).使用DatagramSocket类的receive。

方法老接收一个DatagramPacket实例。

当receive。

方法返回时,数据报文就包含了客户端的地址与端口,这样我们就知道回复信息该发送到什么地方。

(3).使用DatagramSocket类的send()和receive。

方法发送和接收DatagramPacket实例,进行通信。

//服务器类UDPServerBean.java

packageUDP;

importjava.io.*;

import.*;

publicclassUDPServerBean{

privateDatagramSocketdSocket

privateintClientPort;

privateintServerPort

privateInetAddressServerlR

privateInetAddressClientIP;

privateStringcontent;

//无参构造函数

publicUDPServerBean()hrowsSocketException,UnknownHostException{

ClientPort=1111;

ServerPort=1001;

content="";

ClientIP=InetAddressgetLocalHos]);

ServerIP=InetAddressgetLocalHost[);

dSocket=newDatagramSocketServerPort);

}

//信息发送函数,将接收到的信息发回给用户

publicvoidsendToClient()throwsIOException{

byte[]Buffer=("服务器已经收到:

\n"+content).getBytes();

//将要发送的信息给Buffer变量

new

DatagramPacketdPacket=

DatagramPacket(Buffer,Bufferlength,getClientlP(),getClientPort());

//创建DatagramPacke对象dPacket,并设置客户机的IP地址与端口号dSocketsend(dPacket);//发送信息

}

//以下全是UDPServerBea类的各个成员变量的get和set方法

publicInetAddressgetServerIP(){

returnServerIP

}

publicvoidsetServerIP(InetAddressserverIPt)hrowsException{

ServerIP=serverIP;

}

publicDatagramSocketgetdSocket(){

returndSocket

}

publicvoidsetdSocket(DatagramSocketdSocket){

this.dSocket=dSocket;

}

publicintgetClientPort(){

returnClientPort;

}

publicvoidsetClientPort(intclientPort){

ClientPort=clientPort;

}

publicintgetServerPort(){

returnServerPort

}

publicvoidsetServerPort(ntserverPort)throwsSocketException{ServerPort=serverPort;

}

publicStringgetContent(){

returncontent;

}

publicvoidsetContent(Stringcontent){

this.content=content;

publicInetAddressgetClientlP(){returnClientip

}

publicvoidsetClientrIP(InetAddressclientIP){ClientIP=clientIP;

}

}

//服务器端代码,UDPServer.javapackageUDP;

importjava.awt.*;

importjava.awt.event.*;

importjava.io.*;

import.*;

importjavax.swing.*;

publicclassUDPServerextendsJApplet{

privateUDPServerBearserver;privateThreadthread;

privateJTextFieldjtf_ServerPort=newJTextField(10);

privateJButtonjbt_Strat=newJButton("启动");privateJButtonjbt_Exit=newJButton("退出");

privateJTextAreajta_Server=newJTextArea();

publicUDPServer(){

JPaneljplServer11=newJPanel();jplServer11.add(newJLabel"服务器端口:

"));jplServer11.add(tf_ServerPort);

JPaneljplServer21=newJPanel();jplServer21.add(bt_Strat);

jplServer21.add(bt_Exit);

JPaneljplServer0=newJPanel();jplServer0.setLayout(iewGridLayout(2,1));jplServer0.add(jplServer11,BorderLayoutNORTH;jplServer0.add(jplServer21);

add(jplServerO,BorderLayoutNORTH;

add(newJScrollPane(a_Server),BorderLayout.CENTER

//使用线程一

thread=newThread(newRunnable(){

publicvoidrun(){receiveForemClient();//调用发送函数

}

});

//启动按钮事件

jbt_Strat.addActionListener(newActionListener(){

publicvoidactionPeformed(ActionEvente){

intserPort=IntegerparseInt(jtf_ServerPort.getText());//从

jtf_ServerPort文本区中取服务器的端口号

try{

server=newUDPServerBean()//创建服务器UDPServerBean的类对象

server.setServerPort(serPort);//将取得的服务器端口serPort给serve对象

jta_Server.setText("设置服务器端口为"+jtf_ServerPort.getText()+",服务器开启...\n");//将服务器端设置好的信息

显示在jta_Server文本域中

thread.start();//启动线程

}catch(SocketExceptione2){e2.printStackTrace();

}catch(UnknownHostExceptione1){

e1.printStackTrace();

}catch(Exceptione1){

e1.printStackTrace();

}

}

});

//退出按钮的触发事件

jbt_Exit.addActionListener(newActionListener(){

publicvoidactionPeformed(ActionEvente){Systemexit(0);

}

});

}

//接收客户端的信息,并将接收到的信息发回给客户机

publicvoidreceiveForemClient(){

Stringrec_str=nuII;

byte[]Buffer=newbyte[1024];

try{

server.setdSocket(iew

DatagramSocketServer.getServerPort(),server.getServerlP()));//server对象

调用setdSocket()函数,创建新Socke对象(此时服务器端口号为设定的端口号)

}catch(SocketExceptione){

e.printStackTrace();

}

DatagramPacketdPacket=newDatagramPacket(Buffer,Bufferlength);

//创建DatagramPacket象dPacket

while(true){//用循环监听信息接收

try{_

server.getdSocket().receive(dPacket);//接受信息,将接收到

的信息存放在dPacke对象中

rec_str=newString(dPacket.getData(),0,dPacket.getLength());

//取出dPacke对象中接收到的信息

server.setClientPort(dPacket.getPort());//将dPacket对象中

包含的客户机的端口号给serve对象

server.setClientrlP(dPacket.getAddress());//将dPacke对象

中包含的客户机的IP给server对象

server.setContent(rec_str);//将接收的信息给server对象

jta_Server.setText(jta_Server.getText()+"收到IP地址为"+server.getClientlP()+:

端口为"+server.getClientPort()+"的客户机的信息有:

\n"+rec_str+"\n");//将客户机的信息与接收的信息显示在jta_Server文本域中

server.sendToClient();//将信息发送回去

}catch(IOExceptione){

e.printStackTrace();

}

}

}

}

UDP客户端

UDP客户端首先向被动等待联系的服务器端发送一个数据报文。

一个典型的UDP

客户端主要执行以下三步:

(1).创建一个DatagramSocket实例,可以选择对本地地址和端口号进行设置

(2).使用DatagramSocket类的send()和receive。

方法来发送和接收DatagramPacket实例,进行通信。

(3).通信完成后,使用DatagramSocket类的close()方法来销毁该套接字。

//客户端类UDPClientBean.java

packageUDP;

importjava.io.*;

import.*;

classUDPClientBean{

privateDatagramSocketdSocket

privateintServerPort

privateintClientPort;

privateInetAddressServerlR

privateInetAddressClientIP;

privateStringcontent;

//无参构造函数

publicUDPClientBean(XhrowsSocketException,UnknownHostException{ServerPort=1001;

ClientPort=1111;

content="";

ClientIP=InetAddressgetLocalHostf);

ServerIP=InetAddressgetLocalHostf);

dSocket=newDatagramSocketClientPort);

}

//信息发送函数

publicvoidsendToServer(XhrowsIOException{

byte[]Buffer=getContent().getBytes();//将要发送的信息给Buffer变量

DatagramPacketdPacket=new

DatagramPacket(Buffer,Buffer.ength,getServerlP(),getServerPort());

//创建DatagramPacket象dPacket,并指定要发送对象的服务器的IP地址与端口号

dSocketsend(dPacket);//dSocket对象调用send函数发送信息setContent("");

}

//信息接收函数

publicStringreceiveFromServer(XhrowsIOException{

byte[]buffer=newbyte[1024];

DatagramPacketdPacket=newDatagramPacket(buffer,buffer.length);

//创建DatagramPacke对象dPacketdSocketreceive(dPacket);//dSocket对象调用receive函数接收信息Stringreceive_str=newString(dPacket.getData(),O,dPacket.getLength());returnreceive_str;//返回接收到的信息

}_

//下面都是UDPClientBea类的各个成员变量的get和set方法publicDatagramSocketgetdSocket(){

returndSocket;

}

publicvoidsetdSocket(DatagramSocketdSocket){

this.dSocket=dSocket;

}

publicintgetServerPort(){

returnServerPort

}

publicvoidsetServerPort(ntserverPort){

ServerPort=serverPort;

}

publicStringgetContent(){

returncontent;

}

publicvoidsetContent(Stringcontent){

this.content=content;

}

publicInetAddressgetServerIP(){

returnServerIP

}

publicvoidsetServerIP(InetAddressserverIP){

ServerIP=serverIP;

}

publicintgetClientPort(){

returnClientPort;

}

publicvoidsetClientPort(intclientPort){

ClientPort=clientPort;

}

publicInetAddressgetClientlP(){returnClientIP

}

publicvoidsetClientIP(InetAddressclientIP){ClientIP=clientIP;

}

}

//客户端代码,UDPClient.javapackageUDP;

importjava.awt.*;

importjava.awt.event.*;

importjava.io.*;

import.*;

importjavax.swing.*;

publicclassUDPClientextendsJApplet{privateStringcontent;

privateUDPClientBeanclient;

privateJTextFieldjtf_ServerlP=newJTextField(10);privateJTextFieldjtf_ServerPort=newJTextField(10);privateJTextFieldjtf_ClientPort=newJTextField(10);

privateJButtonjbt_Set=newJButton("设置");

privateJTextAreajta_ClientShow=newJTextArea();privateJTextAreajta_Clientlnput=newJTextArea();

privateJButtonjbt_Send=newJBut

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2