Java语言-69:Socket编程-UDP编程

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();


}


}


猜你喜欢

转载自blog.csdn.net/qq_41833394/article/details/80532074