1、Socket : 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
2、public class DatagramSocket extends Object :此类表示用来发送和接收数据报包的套接字。
在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。
DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));
这等价于:
DatagramSocket s = new DatagramSocket(8888);
两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket。
3、简单举例:
package Socket_UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/*
* Udp编程
* 1)不需要建立连接通道
* 2)数据大小有限制
* 3)不可靠连接---->传输速度快!
*
* 发送端的开发步骤:
* 1)创建发送端的Socket对象
* 2)创建数据,并打包
* 3)调用当前发送端Socket对象中的发送的方法
* 4)关闭资源
* */
//发送端
public class DatagramSocket_send {
public static void main(String[] args) throws IOException {
// 1)创建发送端的Socket对象
// DatagramSocket(int port, InetAddress laddr) : 创建数据报套接字,将其绑定到指定的本地地址。
DatagramSocket dgs = new DatagramSocket();
// 2)创建数据,并打包
// DatagramPacket(byte[] buf, int offset,int length, InetAddress address, int
// port)
// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
/**
* buf - 包数据。 offset - 包数据偏移量。 length - 包数据长度。 address - 目的地址。 port - 目的端口号。
*/
// 创建数据
byte[] bytes = "hello world".getBytes();
// 获取报数据长度
int len = bytes.length;
// 获取ip地址
InetAddress addrass = InetAddress.getByName("10.88.23.129");
// 指定端口号
int port = 10086;
// 数据打包
DatagramPacket dgp = new DatagramPacket(bytes, 0, len, addrass, port);
// 3)调用当前发送端Socket对象的发送方法send();
// public void send(DatagramPacket p):throws IOException从此套接字发送数据报包
dgs.send(dgp);
// 4)关闭资源
dgs.close();
}
}
package Socket_UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
* *Udp编程的接收端 开发步骤:
* 1)创建Socket对象
* 2)创建一个数据报包(接收容器)
* 3)调用Socket对象中的接收的方法
* 4)解析实际传递的数据
* 5)将解析的数据(ip,数据)展示在控制台上
* 6)关闭资源
*注意:
*接收端不要运行多次,会出现异常:
* java.net.BindException: Address already in use: Cannot bind
* */
//接收端
public class DatagramSocket_Receive {
public static void main(String[] args) throws IOException {
// 1)创建Socket对象
// public DatagramSocket(int port)创建数据报包套接字对象并且将其绑定到本地主机上的指定端口
DatagramSocket dgs = new DatagramSocket(10086);
// 2)创建一个数据包public DatagramPacket(byte[] buf, int length)
byte[] bytes = new byte[1024];
int len = bytes.length;
DatagramPacket dgp = new DatagramPacket(bytes, len);
// 3)调用Socket对象中的接收方法
dgs.receive(dgp);
// 获取ip地址文本形式
// public InetAddress getAddress() :返回ip地址对象 数据报包类:DataGramPacket
InetAddress address = dgp.getAddress();
String ip = address.getHostAddress();
// 4)解析实际传递的数据:public byte[] getData() :获取缓冲中实际数据(从接收容器中获取)
byte[] bytes1 = dgp.getData();
// public int getLength()返回将要发送或接收到的数据的长度。
int len1 = dgp.getLength();
String data = new String(bytes1, 0, len1);
// 5)将解析资源(ip,数据)展示在控制台上
System.out.println("当前接收到的数据是:" + data + "来源于:" + ip);
// 6)关闭资源
dgs.close();
}
}