一、了解UDP协议 (User Datagram Protocol)
不同于TCP协议,UDP协议不需要“三次握手”,
只需要对方的地址和开放的端口即可,
点击查看TCP 和 UDP的具体区别
二、小项目:在本机上同步访问对方端口,来模拟聊天。
1.主要类的作用:UDP 主要类 DatagramSocket(创建数据套接字),DatagramPacket(创建数据包)
- 创建端口:DatagramSockert (int port) 的构造方法可以开启一个 prot 接口,
- 发送数据:datagramSocket.send(DatagramPackeet datagramPacket) 会发送datagramPacket的数据,到构造datagramPacket 的 对方地址和对方端口 里。
- 接受数据 :datagramSock.receive(DatagramPackeet datagramPacket) 无数据阻塞代码执行处于监听状态,如有数据会接受数据到对象datagramPacket里面因此构造DatagramPacket的方法不同,用处也不同,
- datagramSocket.close() 会关闭 socket网络流.
2.思路分析zhuang
- 发送数据 和 接受数据 都需要 个开一个 端口,所以要用2 个DatagramSocket 来实现
- 因为要同时具备发送数据 和 接收数据,并且接受数据receive()监听,会阻塞程序的运行,因此需要多线程操作,
- 使用while 保持可以持续接受数据和发送数据,并设置退出情况
- 规范代码:声明定义分离,finally执行资源释放,
3.代码
Student.java
package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;
public class Student {
public static void main(String[] args) {
//学生发送消息到老师9001
new Thread(new Send发送(8000,"127.0.0.1",9001)).start();
//学生的接收为 8001
new Thread(new Receive接收(8001)).start();
}
}
Teacher.java
package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;
public class Teacher {
public static void main(String[] args) {
//老师发送到 8001 的学生
new Thread(new Send发送(9000,"127.0.0.1",8001)).start();
//老师开放9001的端口接受
new Thread(new Receive接收(9001)).start();
}
}
Send发送.java
package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* 多线程
*/
public class Send发送 implements Runnable {
private String toAddress;
private int toPort;
private boolean flag;
private int myPort;
@Override
public void run() {
DatagramSocket datagramSocket = null;
Scanner scanner = null;
//构造定义分离
try {
//1. 构造开端口自己的开放的端口
datagramSocket = new DatagramSocket(myPort);
scanner = new Scanner(System.in);
System.out.println("--------回车发送,bye 退出-------");
while (flag) {
String someText = scanner.nextLine();
//2. 做一个发送包,指定目标地址,和端口 new DatagramPacket(字节数组,开始位置,结束位置,地址,端口)
//字节数组,开始位置,结束位置,地址,端口
DatagramPacket datagramPacket = new DatagramPacket(someText.getBytes(), 0, someText.getBytes().length, InetAddress.getByName(toAddress), toPort);
//3.阻塞发送.必须多线程.
datagramSocket.send(datagramPacket);
if (someText.toLowerCase() == "bye") {
flag = false;
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//4. 关闭 dataSocket.close()
if (datagramSocket != null) {
datagramSocket.close();
}
//关闭scanner
scanner.close();
}
}
public Send发送(int myPort, String toAddress, int toPort) {
this.toAddress = toAddress;
this.toPort = toPort;
this.myPort = myPort;
this.flag = true;
}
}
Receive接收.java
package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 接受,多线程打开接受,
* 构造:myPort
* 一、步骤
* 1.
*/
public class Receive接收 implements Runnable {
private int myPort;
@Override
public void run() {
//申明和定义分离
DatagramSocket datagramSocket = null;
byte[] bytes = null;
DatagramPacket datagramPacket = null;
try {
//1.开Socket
datagramSocket = new DatagramSocket(myPort);
while (true) {
//2.新建数据包
bytes = new byte[1024 * 100];
datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
//3.阻塞接受
datagramSocket.receive(datagramPacket);
//输出发信息来源和内容》
System.out.println("----" + datagramPacket.getAddress() + ":" + datagramPacket.getPort());
System.out.println((new String(datagramPacket.getData(), 0, datagramPacket.getLength())));
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭
if (datagramSocket != null) {
datagramSocket.close();
}
}
}
public Receive接收(int myPort) {
this.myPort = myPort;
}
}
因为UDP不需要建立连接,所以先执行Student或Teacher都i可以(你还可以试试群发)
因为不需要建立连接,所以断掉对方也不会马上报错.