Java UDP协议发送端和接收端

Socket

Socket就是为网络服务提供的一种机制。

通信的两端都有Socket。

网络通信其实就是Socket间的通信

数据在两个Socket间通过IO传输

 

构造方法摘要

 

Socket()
通过系统默认类型的 SocketImpl 创建未连接套接字

 

Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

 

UDP传输

DatagramSocket与DatagramPacket

建立发送端,接收端

建立数据包

调用Socket的发送接收方法

关闭Socket

发送端与接收端是两个独立的运行程序。

 

DatagramSocket

此类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。

构造方法摘要

 

DatagramSocket()
构造数据报套接字并将其绑定到本地主机上任何可用的端口

 

DatagramSocket(int port)
创建数据报套接字并将其绑定到本地主机上的指定端口。

 

方法摘要

void

receive(DatagramPacket p)
从此套接字接收数据报包。

void

send(DatagramPacket p)
从此套接字发送数据报包。

void

bind(SocketAddress addr)
将此 DatagramSocket 绑定到特定的地址和端口。

void

close()
关闭此数据报套接字。


 

DatagramPacket

此类表示数据报包。

数据报包用来实现无连接包投递服务。

 

构造方法摘要

 

接收

 

DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。

 

DatagramPacket(byte[] buf, int offset, int length)
构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。

 

发送

 

DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

 

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。

 

DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。

 

DatagramPacket(byte[] buf, int length, SocketAddress address)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

 

 

 

常用方法

InetAddress

getAddress()
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。

int

getPort()
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

byte[]

getData()
返回数据缓冲区。

int

getLength()
返回将要发送或接收到的数据的长度。

 

发送端

UDPSendDemojava

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

public class UDPSendDemo {
   public static void main(String[] args) throws IOException {
      /**
       * 创建UDP传送的发送端
       * 思路:
       * 1,建立udp的socket服务。
       * 2,将要发送的数据封装到数据包中。
       * 3,通过udp的socket服务将数据包发送出去
       * 4,关闭socket服务
       */
      // 1,udpsocket服务。使用DategramSocket对象。
      DatagramSocket ds = new DatagramSocket();
      // 2,将要发送的数据封装到数据包中。
      String str = "UDP传送演示:哥们来了";
      // 使用DatagramPacket将数据封装到该对象中。
      byte buf[] = str.getBytes();
      DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"), 10000);
      // 3,通过udp的socket服务将数据包发送出去,使用send方法
      ds.send(dp);
      // 4,关闭资源
      ds.close();
   }
}


发送端

UDPReceiveDemo.java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiveDemo {
   public static void main(String[] args) throws IOException {
      System.out.println("接收端启动。。。");
      /**
      *建立UDP接收端的思路
      *1,建立UDP Socket服务,因为是接收端,必须要明确一个端口
      *2,创建数据包,用于存储接收的数据,方便数据包对象的方法解析这些数据
      *3,使用Socket服务的receive方法将接收的数据存储到数据包中
      *4,通过数据包的方法解析数据包中的数据
      *5,关闭资源
      */
      // 1,建立UDP Socket服务
      DatagramSocket ds = new DatagramSocket(3693);
      // 2,创建数据包
      byte buf[] = new byte[1024];
      DatagramPacket dp = new DatagramPacket(buf, buf.length);
      // 3,使用接收方法将数据存储到数据包中
      ds.receive(dp);// 阻塞式
      // 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口
      String ip = dp.getAddress().getHostAddress();
      int port = ds.getPort();
      String msg = new String(dp.getData(), 0, dp.getLength());
      System.out.println(ip + "," + port + "," + msg);
      ds.close();
   }
}