1 UDP编程(Socket编程)
- 概述:Socket是两台计算机的通信点
- 别称:Socket编程也称为套接字编程、通信点编程、端到端编程、点到点编程
2 UDP编程说明
- UDP编程的步骤:
发送端:
1、准备通信点对象
2、准备发送的包裹对象
3、调用通信点的发送方法
4、关闭通信点
接收端:
1、准备通信点对象
2、准备接收数据的容器
3、调用通信点的接收方法接收数据
4、解析并使用接收到的数据
5、关闭通信点 - 使用的Socket是:DatagramSocket
- 构造方法:
DatagramSocket()
:不指定端口号,创建通信点,端口号随机分配,一般用于发送端
DatagramSocket(int port)
:指定端口号,创建通信点,一般用于接收端 - 成员方法:
send(DatagramPacket dp)
:将一个dp数据报包发送
receive(DatagramPacket dp)
:将数据接收到dp参数中 - DatagramPacket介绍:
(1)表示一个数据报数据的封装对象的类型
(2)构造方法:
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
第一个参数:表示需要发送的数据
第二个参数:表示从数组的哪一个位置开始发送
第三个参数:发送字节的长度
第四个参数:发送给哪一个ip
第五个参数:发送给哪一个端口号
DatagramPacket(byte[] buf, int length)
- 常用成员方法:
函数 | Value |
---|---|
getData() | 返回该数据包中的字节数组 |
getLength() | 返回该数据包中接收到的字节个数 |
getAddress() | 获取发送端的InetAddress对象 |
getPort() | 获取发送端的端口号 |
3 案例1
需求:
(1)发送端实现键盘录入发送数据
(2)发送端可以一直录入数据,直到录入的数据为:end,结束发送
(3)接收端可以一直接收发送端录入的数据
3.1 发送端代码
package udp.demo2;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Sender {
public static void main(String[] args) throws IOException {
//1、先创建一个通信点对象
DatagramSocket ds = new DatagramSocket();
//2、键盘录入信息发送
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请录入您要发送的数据:");
String str = sc.nextLine();
//3、将数据封装为一个数据报包
byte[] bs = str.getBytes();
DatagramPacket dp = new DatagramPacket(bs,0,bs.length, InetAddress.getByName("192.168.38.226"),10010);
//4、发送信息
ds.send(dp);
if(str.equals("end")){
break;
}
}
//5、关闭通信点
ds.close();
}
}
3.2 接收端代码
package udp.demo2;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receiver {
public static void main(String[] args) throws IOException {
//1、准备一个接收端的通信点对象
DatagramSocket ds = new DatagramSocket(10010);
//2、准备一个数据报包,用来接收数据
byte[] bs = new byte[1024];
while(true){
DatagramPacket dp = new DatagramPacket(bs,bs.length);
//3、使用方法接收获取数据
ds.receive(dp);
//4、解析并使用数据报包中的数据
byte[] bs2 = dp.getData();
int len = dp.getLength();
String str = new String(bs2,0,len);
if(str.equals("end")){
break;
}
System.out.println("接收的数据为:" + str);
}
//5、关闭通信点
ds.close();
}
}
4 案例2
需求:
(1)实现接收端和发送端可以互相通信
(2)两端都可以使用键盘录入发送数据,录入的结果为end,结束通信
4.1 发送端代码
package udp.demo3;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Sender {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while(true){
//发送端发送的数据:
System.out.println("请录入您要发送的数据:");
String str = sc.nextLine();
byte[] bs = str.getBytes();
DatagramPacket dp = new DatagramPacket(bs,0,bs.length, InetAddress.getByName("192.168.38.226"),10010);
if(str.equals("end")){
break;
}
ds.send(dp);
//发送端获取接收端给的回复:
byte[] bs2 = new byte[1024];
DatagramPacket dp2 = new DatagramPacket(bs2,bs2.length);
ds.receive(dp2);
byte[] bs3 = dp2.getData();
int len = dp2.getLength();
System.out.println("获取的数据为:" + new String(bs3,0,len));
}
ds.close();
}
}
4.2 接收端代码
package udp.demo3;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Scanner;
public class Receiver {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10010);
Scanner sc = new Scanner(System.in);
byte[] bs = new byte[1024];
while(true){
//表示接收另一端发送的数据:
DatagramPacket dp = new DatagramPacket(bs,bs.length);
ds.receive(dp);
byte[] bs2 = dp.getData();
int len = dp.getLength();
String str = new String(bs2, 0, len);
System.out.println("获取的数据为:" + str);
//接收数据之后,给另一端给出一个答案和反馈:
System.out.println("请录入您要回复的信息:");
String str2 = sc.nextLine();
byte[] bs3 = str2.getBytes();
DatagramPacket dp2 = new DatagramPacket(bs3,0,bs3.length,dp.getAddress(),dp.getPort());
ds.send(dp2);
if(str2.equals("end")){
break;
}
}
ds.close();
}
}