基于UDP协议的网络编程

UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象。

Java使用DatagramSocket代表基于UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报。Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送数据都是通过DatagramPacket对象完成的。

DatagramSocket有4个构造器:

1.DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的一个端口

2.DatagramSocket(int port):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口

3.DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口

4.DatagramSocket(SocketAddress bindaddr):创建一个DatagramSocket实例,并绑定一个SocketAddress实例

使用DatagramSocket对象的send(DatagramPacket p)方法来发送数据,使用DatagramSocket对象的receive(DatagramPacket p)方法来接收数据。

DatagramPacket构造器分为两类:

参数列表有InetAddress实例或者SocketAddress实例的,常用的是DatagramPacket(byte buf[], int length, InetAddress address, int port)。这类构造器指定目的IP和目的端口,创建出的DatagramPacket实例用来包装待发送的数据,并当做参数传到DatagramSocket实例的send方法中。

参数列表没有InetAddress实例和SocketAddress实例的,常用的是DatagramPacket(byte buf[], int length)。用这类构造器创建出来的DatagramPacket实例用来接收数据,被当做参数传到DatagramSocket实例的receive方法中。

发送方代码示例:

public class UDPSend {
    public static void main(String args[]) {
        try {
            // 创建DatagramSocket实例
            DatagramSocket socket = new DatagramSocket(9999);
            String text = "hello world";
            byte[] bytes = text.getBytes();
            // 发送方的数据报实例包装待发送的数据,并指定目的IP和目的端口
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 10000);
            // 发送数据报
            socket.send(packet);
            // 关闭socket资源
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收方代码示例:

public class UDPReceive {
    public static void main(String[] args) {
        try {
            // 创建DatagramSocket实例,指定用来接收数据的端口是10000
            DatagramSocket socket = new DatagramSocket(10000);
            // 创建一个空的字节数组,字节数组的长度决定了
            byte[] buf = new byte[1024];
            // 创建接收方数据报实例时传入一个空的字节数组,该数据的长度决定了数据报实例最多能接受多少数据
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            // 接收数据
            socket.receive(packet);
            // 把字节数据封装成字符串。packet.getLength()返回接收数据的实际长度
            String msg = new String(packet.getData(), 0, packet.getLength());
            System.out.println(msg);
            // 关闭socket资源
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上,先启动接收方,再启动发送方。接收方中的DatagramSocket对象的receive(DatagramPacket p)方法会阻塞线程,等待数据的来临,一旦接收到数据,线程结束。

DatagramPacket对象还有几个额外的方法比较实用:

1.InetAddress getAddress():发送方的DatagramPacket对象调用时,该方法返回数据报的目的IP;接收方的DatagramPacket对象调用时,该方法返回发送方的IP地址

2.getPort():发送方的调用时,返回目的端口;接收方调用时,返回发送方的端口

3.SocketAddress getSocketAddress():SocketAddress地址

时间: 2024-10-09 05:02:07

基于UDP协议的网络编程的相关文章

基于 UDP 协议的网络编程

类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序 UDP 数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达 DatagramPacket 对象封装了 UDP 数据报(<64k),在数据报中包含了发送端的 IP 地址和端口号以及接收端的 IP 地址和端口号 UDP 协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接 举例: publ

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

Java中的基于Tcp协议的网络编程

一:网络通信的三要素? IP地址     端口号     通信协议 IP地址:是网络中设备的通信地址.由于IP地址不易记忆,故可以使用主机名.本地环回地址,127.0.0.1   本地主机名localhost 端口号:发送端准备的数据要发送到指定的目的应用程序上,为了标识这些应用程序,所以用网络数字来标识这些不同的应用程序,这些数 字称为端口号.端口号是不同进程之间的标识.一般来说,有0~65535的端口可供使用,但是1~1024系统使用,或者称作保留端口. 通信协议:指定义的通信规则,这个规则

基于UDP的Socket网络编程实现用户登录的实现

package Test_UDP_Socket; import java.net.DatagramPacket.* //服务器端 import java.net.DatagramSocket; import java.net.InetAddress; public class ServerUDP { public static void main(String[] args) throws Exception{ //1.先实现接收Client信息 DatagramSocket socketSer

基于UDP协议之——socket编程

一. socket API 前面一篇<基于TCP协议之--socket编程>http://2627lounuo.blog.51cto.com/10696599/1775559已经花了大量的篇幅讲述了socket和使用基本的socket API所需要注意的问题,这里就不再赘述了.下面主要谈论的是UDP和TCP在socket编程中的不同之处: 1. 创建sock 和TCP面向连接的可靠的字节流传输服务不同的是,UDP是无连接的不可靠的数据报传输服务:虽然有所不同,但同样在进程间通信的时候需要提供出

基于UDP协议的网络程序

下图是基于UDP协议的客户端/服务器程序的一般流程: 图1.1 UDP协议通信流程 UDP套接口是无连接的.不可靠的数据报协议: 既然他不可靠为什么还要用呢?其一:当应用程序使用广播或多播时只能使用UDP协议:其二:由于他是无连接的,所以速度快.因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时. 建立UDP套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口:由于UDP是无连接的,所以服务器端并不需要listen或

基于UDP协议的socket编程

UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启动服务端. 2.不可靠.数据在本地通过网络发出之后,UDP协议会立即清除本地的缓存,即使对方没有收到该数据,也不做任何补救措施. 3.数据报协议. 代码示例: 1 import socket 2 server = socket.socket(socket.AF_INET,socket.SOCK_DG

网络 基于UDP协议的socket编程

一.UDP协议        UDP协议的特点:用户数据包协议             1.UDP协议是无连接的.也就说在数据发送之前并不需要建立连接(当然,在发送数据结束的时候也就不存在链接的释放),因此减少了开销和数据发送之前的时延.             2.UDP使用尽最大努力的交付,但是不保证可靠性的交付,因此主机不需要维持复杂的链接状态表.(网上的的可靠性建立在应答的基础上,不提供可靠性交付,即不需要应答,因此不需要维护状态表)             3.UDP是面向报文.发送方

初识Socket通信:基于TCP和UDP协议学习网络编程

学习笔记: 1.基于TCP协议的Socket网络编程: (1)Socket类构造方法:在客户端和服务器端建立连接 Socket s = new Socket(hostName,port);以主机名和端口号作为参数来创建一个Socket对象. Socket s = new Socket(address,port);以InetAddress对象和端口号作为参数来创建一个Socket对象. 创建Socket对象时可能抛出UnknownHostException或IOException异常,必须捕获它们