您的位置:首页 > 理论基础 > 计算机网络

学习笔记之JavaSE(51)--网络编程3

2016-12-04 20:00 489 查看
今天学习的内容是UDP传输

无论传输层使用的是UDP协议还是TCP协议,都必须借助socket--套接字的帮助才能进行网络数据传输。UDP传输和TCP传输最大的区别就在于是否需要进行连接,实际上等同于是否需要进行socket连接

Java也对这两种传输协议所使用的socket及相关内容进行了描述,其中UDP传输主要使用DatagramSocket类和DatagramPacket类,DatagramSocket类表示接收和发送数据报包的套接字,DatagramPacket类表示数据报包。UDP传输的基本模式:

接收端:
使用DatagramSocket(port)创建接收数据报包的套接字,并绑定到指定端口(此端口标识接收端进程)

使用DatagramPacket(buf,length)创建用于接收数据的数据报包

使用DatagranSocket的receive(datagramPacket)方法接收数据报包(阻塞式方法,类似于IO流的读取方法)
发送端:
使用DatagramSocket()创建发送数据报包的套接字,不指定端口(系统会指定任意可用端口来标识发送端进程,并将套接字绑定到此端口)。注意:如果你指定了端口,就不能在一台设备多次运行本进程,因为一个端口不能被多个进程共用!
使用DatagramPacket(buf,length,inetAdress,port)创建用于发送数据的数据报包,将要发送的数据封装到此包中,并指定接收端的IP地址对象与端口号

使用DatagranSocket的send(datagramPacket)方法接收数据报包

注意:套接字没有进行连接,直接传输数据,这就是UDP传输的特点!
示例程序(这里只演示了单向通信):
public class UdpReceive {

public static void main(String[] args) {

System.out.println("UdpReceive start....");
DatagramSocket socket = null;
DatagramPacket packet = null;
try {
socket = new DatagramSocket(5000);// 创建接收数据报包的套接字,并绑定到指定端口(此端口标识接收端进程)
while (true) {
byte[] buf = new byte[1024];// 接收数据使用的数组
packet = new DatagramPacket(buf, buf.length);// 创建用于接收数据的数据报包
socket.receive(packet);// 接收数据报包--如果没有接收到数据,这个方法是阻塞的
System.out.println("got a packet");
// 通过数据报包的方法,解析其中的数据(比如数据内容,发送端的IP地址和端口号等等)
System.out.println("接收的数据:" + new String(buf, 0, packet.getLength()));
System.out.println("发送端的IP地址:" + packet.getAddress().getHostAddress());// 10.220.3.122
// 发送端IP地址(动态变化的内网IP)
System.out.println("发送端的端口号:" + packet.getPort());// 54302
// 发送端使用的端口号(每次系统指定的端口号都不同!!)
System.out.println("receive success");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (!socket.isClosed()) {
socket.close();
System.out.println("socket close success");// 如果发生异常就关闭socket
}
}
}
}

public class UdpSend {

public static void main(String[] args) {

System.out.println("UdpSend start...");
DatagramSocket socket = null;
DatagramPacket packet = null;
BufferedReader in = null;
try {
socket = new DatagramSocket();// 创建发送数据报包的套接字,不指定端口(系统会指定任意可用端口来标识发送端进程,并将套接字绑定到此端口)
in = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = in.readLine()) != null) {
byte[] buf = line.getBytes();// 要发送的数据(用户键盘输入)
packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 5000);// 创建用于发送数据的数据报包,将要发送的数据封装到此包中
// 并指定接收端的IP地址对象与端口号
socket.send(packet);// 发送数据报包
System.out.println("send success");
if (line.equals("tuichu")) {
break;
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (!socket.isClosed()) {
socket.close();
System.out.println("socket close success");
}
if (in != null) {
try {
in.close();
System.out.println("in close success");
} catch (IOException e) {
System.out.println("关闭资源失败");
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: