UDP对象
- 服务器端:一经启动就会对外提供服务;不知道客户端什么时候发送请求;它是被动接收的一方
【就相当于饭店,一开始营业,就要时刻准备为顾客服务】 - 客户端:在需要的时候才发起连接;它是主动发送请求的一方
【相当于顾客,什么时候饿了,就回去饭店点餐吃】
UDP编程
服务器端
-
启动一个UDP服务器端(IP、端口号)
端口号是需要自己手动设置的(1024一前的端口号被称为知名端口号,都是被占用的,我们自己定义的端口号从9000开始往后起)
IP地址我们是不需要管的,会默认是本机的IP地址 -
服务器等待客户端的链接用receive方法,这时候必须要有一个包裹DatagramPacket
需要有参数 【传递数据的载体数组,以及包裹的大小】 -
接收到客户端的信息,然后进行打印
-
给客户端响应,用send方法发送消息(同样需要初始化一个包裹)
不同的是,这里需要四个参数【发送内容的转换成载体数组,包裹大小,客户端ip地址,客户端端口号】
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* Created with IntelliJ IDEA.
* Description:UDP 服务器端
* User: starry
* Date: 2021 -04 -13
* Time: 20:53
*/
public class UDPServer {
//端口号
private static final int port = 9001;
//数据的最大值
private static final int bleng = 1024;
public static void main(String[] args) throws IOException {
//1.启动一个UDP服务器端(IP、端口号)
DatagramSocket socket = new DatagramSocket(port);
System.out.println("服务器已经启动!");
while(true) {
//2.初始化数据包
DatagramPacket clientPacket = new DatagramPacket(
new byte[bleng],
bleng
);
//3.等待客户端的链接
socket.receive(clientPacket);
// 执行到此步骤,表示已经有客户端连接
//4.接收到客户端的信息
String msg = new String(clientPacket.getData());
System.out.println("接收到客户端的信息:"+msg);
//给客户端一个响应
String serMsg = msg.replace("吗?","。");
//发送消息
DatagramPacket serPacket = new DatagramPacket(
serMsg.getBytes(),
serMsg.getBytes().length, //注意是字节长度
clientPacket.getAddress(), //ip地址
clientPacket.getPort() //端口号
);
socket.send(serPacket);
}
}
}
客户端
-
启动客户端
这里不设置端口号,默认就是由系统自动分配一个端口号,动态端口号 -
输入一个消息,并发送给服务器端,需要用到send方法,此时也需要包裹
参数为【发送内容的转换成载体数组,包裹大小,服务器端ip地址,服务器端端口号】 -
接收服务器的返回信息,用receive方法来接收,同样需要一个包裹
参数为【传递数据的载体数组,以及包裹的大小】 -
打印接收到的消息
package udp;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:客户端
* User: starry
* Date: 2021 -04 -13
* Time: 21:07
*/
public class UDPClient {
//服务器的ip地址
private static final String ip = "127.0.0.1";
//服务器的端口号
private static final int port = 9001;
//数据的最大值
private static final int bleng = 1024;
public static void main(String[] args) throws IOException {
//1.启动客户端
DatagramSocket client = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.println("我:");
String msg = scanner.nextLine();
//2.给服务器发送消息
DatagramPacket datagramPacket = new DatagramPacket(
msg.getBytes(),
msg.getBytes().length,
InetAddress.getByName(ip),
port
);
client.send(datagramPacket);
//3.接收服务器的返回信息
DatagramPacket serPacket = new DatagramPacket(
new byte[bleng],
bleng
);
client.receive(serPacket);
//接收到服务器端返回信息
String serMsg = new String(serPacket.getData());
System.out.println("对方:"+serMsg);
}
}
}
UDP服务端发布
-
打开project structure
-
选择从当前项目打包
-
选择启动类
-
选择我的服务器端
-
复制该路径,然后ok,再ok。
-
打包项目
-
build
-
如果刚才的路径没复制上,project structure也有
-
把jar包用Xftp7工具上传到云服务器
-
打开Xshell 工具 用命令启动这个jar包
-
把自己本地代码客户端的ip改成云服务器ip
private static final String ip = "82.156.229.239";
小机器人对话
此时启动我本地的客户端,就会回答我说的化