java之网络编程UDP篇

java之网络编程UDP篇

UDP介绍

UDP(user datagram protocol)用户数据报协议,传输层协议。

tcp和udp的区别:

Tcp是面向连接的,udp是无连接的;
Tcp是可靠的,udp是不可靠的;
Tcp只支持点对点通信,udp支持一对一,一对多,多对多的通信模式;
Tcp是面向字节流的,udp是面向报文的;
Tcp有拥塞控制机制;udp没有拥塞控制,适合媒体通信;
Tcp首部开销(20个字节)比udp的首部开销(8个字节)要大;

使用UDP的协议:

DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
TFTP(Trival File Transfer Protocal):简单文件传输协议,该协议在熟知端口69上使用UDP服务。

总的来说,相比于TCP而言,UDP不如其广泛,但是在需要很强的实时交互性场合,如网络游戏和视频会议方面,UDP相对重要。因为UDP协议不需要维持连接的开销,支持一对多。多对多的通信模式。如果说TCP类似于打电话,而UDP就相当于发短信。

在网络编程中,必须要求可靠数据传输的信息一般使用TCP,而一般的数据使用UDP实现。

java中的UDP实现

同TCP一样,java的java.net包中,也提供了两个类DatagramSocket和DatagramPacket来支持UDP的数据报(Datagram)通信。

其中DatagramSocket用于在程序之间建立传送数据报的通信通道,DatagramPacket则用来表示一个数据报。DatagramSocket发送的每个包都需要指定地址,而DatagramPacket则是在首次创建时指定地址,以后所有数据的发生都通过此socket。

UDP的客户端编程也是4个部分:建立连接、发送数据、接受数据和关闭连接。

而UDP方式的网络编程的服务端实现,也是同TCP方式的服务器端实现类似,也是服务器端监听某个端口,然后获得数据报文包,进行逻辑 处理后将处理以后的结果反馈给客户端,最后关闭网络连接。

服务器端代码如下:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPserver {
public static void main(String[] args) throws Exception{
int serverPort = 9999;
DatagramSocket ds = null;
DatagramPacket sendDp;
DatagramPacket receiveDp;

 ds = new DatagramSocket(serverPort);
 System.out.println("服务器创建成功!端口号为: "+ds.getLocalPort());

 byte\[\] buf = new byte\[1024\];
 receiveDp = new DatagramPacket(buf,buf.length);
 ds.receive(receiveDp);
 System.out.println("收到: "+ receiveDp.getSocketAddress());
 System.out.println("Data is "+ new String(receiveDp.getData(),0,receiveDp.getLength()));

 InetAddress clientIp = receiveDp.getAddress();
 int clientPort = receiveDp.getPort();

 String respose = "OK,收到来自星星的你的祝福";
 byte\[\] bData = respose.getBytes();
 sendDp = new DatagramPacket(bData,bData.length,clientIp,clientPort);
 ds.send(sendDp);
 ds.close();

}
}

客户端代码如下:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPclient {
public static void main(String[] args) throws Exception{
DatagramSocket ds = null;//
DatagramPacket sendDp;
DatagramPacket receiveDp;
String serverHost = “127.0.0.1”;
int serverPort = 9999;
ds = new DatagramSocket();
byte[] buf = “hello,UDP协议!来自星星的问候……”.getBytes();
sendDp = new DatagramPacket(buf,buf.length,InetAddress.getByName(serverHost),serverPort);

 ds.send(sendDp);

 byte\[\] bufr = new byte\[1024\];
 receiveDp = new DatagramPacket(bufr,bufr.length);
 ds.receive(receiveDp);

 byte\[\] response = receiveDp.getData();
 int len = receiveDp.getLength();
 String s = new String(response,0,len);
 System.out.println("服务器端反馈为: "+s);
 ds.close();

}
}

代码功能即是客户端向服务器发送问候,服务器返回问候。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值