之前有写过关于TCP协议的socket套接字,这里介绍的是UDP的数据包DatagramSocket。
TCP和UDP的优缺点以及他们各自的特点这里我就不多说了。总之都是有利有弊,
看中速度,那么就"牺牲"安全,注重安全,那么在速度方面可能就要作出“牺牲”了。
下面通过一个小例子来说明UDP的DatagramSocket:
客户端:
package com.data.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* 客户端【数据包发送】
* @author winy_lm
*
*/
public class DatagramSocketClient {
public static void main(String[] args) {
try {
// 创建一个socket对象
DatagramSocket socket = new DatagramSocket();
//封装需要发送的信息数据包
byte[] b = "客户端发送数据验证".getBytes();
DatagramPacket packet = new DatagramPacket(
b,
b.length,
InetAddress.getLocalHost(), //ip地址,InetAddress类提供各种获取计算机信息的方法
9555);// 端口号
//向端口为
socket.send(packet);
} catch (SocketException e) {
e.printStackTrace();
}catch (UnknownHostException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
服务器:
package com.data.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 服务器【数据包接收】
* @author winy_lm
*
*/
public class DatagramSocketServer {
public static void main(String[] args) {
try {
// 创建一个服务,指定端口号
DatagramSocket socket = new DatagramSocket(9555);
// packet对象需要一个字节数组参数
byte[] b = new byte[100];
// 创建一个空的数据包对象,用来接收客户端client传过来的packet数据包
DatagramPacket packet = new DatagramPacket(b, b.length);
// 通过socket将发送到当前端口的数据包接收到packet中
socket.receive(packet);
// 输出该数据包的数据
System.out.write(packet.getData(),0,packet.getLength());
System.out.println();//换行,为了和输出数据包信息区分开来
System.out.println("当启动server服务器时,验证此处是否在启动的时候就执行");
} catch (SocketException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
注意:
在讲解socket的时候有说过,必须先启动服务器,要不然客户端会报错![java.net.ConnectException: Connection refused: connect]
但是这里是通过DatagramSocket来发送信息,也就是采取的UDP的方式,所以当先启动客户端的时候,不会报任何错误!
还有一种情况是先启动服务器,当客户端发送数据的端口号设置错误的时候,也不会报错!!!
即采用DatagramSocket是不需要服务器反馈任何信息的,客户端信息发出去就行了,不会去管有没有发送成功或是发送正确!!!
欢迎大家提出宝贵意见!!!!!!!