文章目录
- UDP 通信编程
- 发送 数据
- 接收 数据
- 实现简易的通信聊天
UDP 通信编程
发送 数据
- 创建 DatagramSocket 对象(创办 快递公司)
不传参,随机一个可用端口,传参,可指定端口。(发送端口) - 创建 DatagramPacket 对象(打包 需要发送的快递)
需传入指定的byte数组,长度,要发往的地址,接收的端口号。和我们现实中也很像,快递单上的信息。 - 发送数据(快递公司发快递)
- 关闭(关闭快递公司)
package com.lpy.socketdemo2;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建 DatagramSocket 对象
DatagramSocket ds = new DatagramSocket();
String str = "hello world";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 80;
// 创建 DatagramPacket 对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
// 发送数据
ds.send(dp);
// 关闭
ds.close();
}
}
接收 数据
- 创建 DatagramSocket 对象,指定接收用的端口号(创建快递公司)
- 创建 DatagramPacket 对象,用byte数组接收,指定接收长度(准备一个包,去装快递)
- 接收数据(快递公司接收快递)
- 解析数据(打开包裹)
package com.lpy.socketdemo3;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建 DatagramSocket 对象,指定接收用的端口号
DatagramSocket ds = new DatagramSocket(10086);
byte[] bytes = new byte[1024];
// 创建 DatagramPacket 对象,用byte数组接收,指定接收长度
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 接收数据
ds.receive(dp);
// 解析数据
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到的数据" + new String(data, 0, len)); // // 接收到的数据hello world
System.out.println("该数据是从" + address + "这台电脑中的" + port + "端口发送出来的"); // // 该数据是从/127.0.0.1这台电脑中的65220端口发送出来的
// 关闭
ds.close();
}
}
实现简易的通信聊天
就是多加了个while循环而已。
send端:
package com.lpy.socketdemo4;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
int port = 80;
InetAddress address = InetAddress.getByName("127.0.0.1");
while (true) {
System.out.println("请输入发送的内容:");
String str = sc.nextLine();
byte[] bytes = str.getBytes("UTF-8");
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
ds.send(dp);
if (str.equals("bye")) break;
}
ds.close();
}
}
receive端:
package com.lpy.socketdemo4;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class receive {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(80);
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
while (true) {
ds.receive(dp);
byte[] data = dp.getData();
int len = dp.getLength();
String str = new String(data, 0, len, "UTF-8");
System.out.println("由" + dp.getAddress().getHostAddress() + "主机" + dp.getPort() +"端口号发来了:");
System.out.println(str);
if (str.equals("bye")) {
break;
}
}
ds.close();
}
}
可通过如下设置,就可运行多个send类来发送数据。