计算机网络课程设计利用java实现UDP协议详情Word文档格式.docx
- 文档编号:16324472
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:18
- 大小:139.44KB
计算机网络课程设计利用java实现UDP协议详情Word文档格式.docx
《计算机网络课程设计利用java实现UDP协议详情Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计利用java实现UDP协议详情Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
在Java语言为实现程序的相互通信提供了许多有用的抽象应用程序接口(API,ApplicationProgrammingInterface),这类应用程序接口被称为套接字(sockets)。
因此,本文UDP协议的编程所需要用到的接口就是套接字。
2.实验环境
开发环境:
个人PC+win8.1+myeclipse10
3.实验原理以及相关内容
3.1UDP简介
UDP是UserDatagramProtocol的简称,中文全称是用户数据包协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
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;
privateInetAddressServerIP;
privateInetAddressClientIP;
privateStringcontent;
//无参构造函数
publicUDPServerBean()throwsSocketException,UnknownHostException{
ClientPort=1111;
ServerPort=1001;
content="
"
;
ClientIP=InetAddress.getLocalHost();
ServerIP=InetAddress.getLocalHost();
dSocket=newDatagramSocket(ServerPort);
}
//信息发送函数,将接收到的信息发回给用户
publicvoidsendToClient()throwsIOException{
byte[]Buffer=("
服务器已经收到:
\n"
+content).getBytes();
//将要发送的信息给Buffer变量
DatagramPacketdPacket=newDatagramPacket(Buffer,Buffer.length,getClientIP(),getClientPort());
//创建DatagramPacket对象dPacket,并设置客户机的IP地址与端口号
dSocket.send(dPacket);
//发送信息
//以下全是UDPServerBean类的各个成员变量的get和set方法
publicInetAddressgetServerIP(){
returnServerIP;
publicvoidsetServerIP(InetAddressserverIP)throwsException{
ServerIP=serverIP;
publicDatagramSocketgetdSocket(){
returndSocket;
publicvoidsetdSocket(DatagramSocketdSocket){
this.dSocket=dSocket;
publicintgetClientPort(){
returnClientPort;
publicvoidsetClientPort(intclientPort){
ClientPort=clientPort;
publicintgetServerPort(){
returnServerPort;
publicvoidsetServerPort(intserverPort)throwsSocketException{
ServerPort=serverPort;
publicStringgetContent(){
returncontent;
publicvoidsetContent(Stringcontent){
this.content=content;
publicInetAddressgetClientIP(){
returnClientIP;
publicvoidsetClientrIP(InetAddressclientIP){
ClientIP=clientIP;
}
//服务器端代码,UDPServer.java
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassUDPServerextendsJApplet{
privateUDPServerBeanserver;
privateThreadthread;
privateJTextFieldjtf_ServerPort=newJTextField(10);
privateJButtonjbt_Strat=newJButton("
启动"
);
privateJButtonjbt_Exit=newJButton("
退出"
privateJTextAreajta_Server=newJTextArea();
publicUDPServer(){
JPaneljplServer11=newJPanel();
jplServer11.add(newJLabel("
服务器端口:
));
jplServer11.add(jtf_ServerPort);
JPaneljplServer21=newJPanel();
jplServer21.add(jbt_Strat);
jplServer21.add(jbt_Exit);
JPaneljplServer0=newJPanel();
jplServer0.setLayout(newGridLayout(2,1));
jplServer0.add(jplServer11,BorderLayout.NORTH);
jplServer0.add(jplServer21);
add(jplServer0,BorderLayout.NORTH);
add(newJScrollPane(jta_Server),BorderLayout.CENTER);
//使用线程
thread=newThread(newRunnable(){
publicvoidrun(){
receiveForemClient();
//调用发送函数
}
});
//启动按钮事件
jbt_Strat.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
intserPort=Integer.parseInt(jtf_ServerPort.getText());
//从jtf_ServerPort文本区中取服务器的端口号
try{
server=newUDPServerBean();
//创建服务器UDPServerBean的类对象
server.setServerPort(serPort);
//将取得的服务器端口serPort给server对象
jta_Server.setText("
设置服务器端口为"
+jtf_ServerPort.getText()+"
,服务器开启...\n"
//将服务器端设置好的信息显示在jta_Server文本域中
thread.start();
//启动线程
}catch(SocketExceptione2){
e2.printStackTrace();
}catch(UnknownHostExceptione1){
e1.printStackTrace();
}catch(Exceptione1){
}
}
//退出按钮的触发事件
jbt_Exit.addActionListener(newActionListener(){
System.exit(0);
//接收客户端的信息,并将接收到的信息发回给客户机
publicvoidreceiveForemClient(){
Stringrec_str=null;
byte[]Buffer=newbyte[1024];
try{
server.setdSocket(newDatagramSocket(server.getServerPort(),server.getServerIP()));
//server对象调用setdSocket()函数,创建新Socket对象(此时服务器端口号为设定的端口号)
}catch(SocketExceptione){
e.printStackTrace();
DatagramPacketdPacket=newDatagramPacket(Buffer,Buffer.length);
//创建DatagramPacket对象dPacket
while(true){//用循环监听信息接收
try{
server.getdSocket().receive(dPacket);
//接受信息,将接收到的信息存放在dPacket对象中
rec_str=newString(dPacket.getData(),0,dPacket.getLength());
//取出dPacket对象中接收到的信息
server.setClientPort(dPacket.getPort());
//将dPacket对象中包含的客户机的端口号给server对象
server.setClientrIP(dPacket.getAddress());
//将dPacket对象中包含的客户机的IP给server对象
server.setContent(rec_str);
//将接收的信息给server对象
jta_Server.setText(jta_Server.getText()+"
收到IP地址为"
+server.getClientIP()+"
端口为"
+server.getClientPort()+"
的客户机的信息有:
+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
classUDPClientBean{
//无参构造函数
publicUDPClientBean()throwsSocketException,UnknownHostException{
ClientPort=1111;
dSocket=newDatagramSocket(ClientPort);
//信息发送函数
publicvoidsendToServer()throwsIOException{
byte[]Buffer=getContent().getBytes();
//将要发送的信息给Buffer变量
DatagramPacketdPacket=newDatagramPacket(Buffer,Buffer.length,getServerIP(),getServerPort());
//创建DatagramPacket对象dPacket,并指定要发送对象的服务器的IP地址与端口号
//dSocket对象调用send函数发送信息
setContent("
//信息接收函数
publicStringreceiveFromServer()throwsIOException{
byte[]buffer=newbyte[1024];
DatagramPacketdPacket=newDatagramPacket(buffer,buffer.length);
//创建DatagramPacket对象dPacket
dSocket.receive(dPacket);
//dSocket对象调用receive函数接收信息
Stringreceive_str=newString(dPacket.getData(),0,dPacket.getLength());
returnreceive_str;
//返回接收到的信息
//下面都是UDPClientBean类的各个成员变量的get和set方法
publicvoidsetServerPort(intserverPort){
publicvoidsetServerIP(InetAddressserverIP){
publicvoidsetClientIP(InetAddressclientIP){
//客户端代码,UDPClient.java
publicclassUDPClientextendsJApplet{
privateUDPClientBeanclient;
privateJTextFieldjtf_ServerIP=newJTextField(10)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 利用 java 实现 UDP 协议 详情