初识Tomcat
服务端
- 通过JDK提供的类和方法实现 -S
- Tomcat -S 常用语Java后台开发
客户端
- 通过JDK提供的类和方法实现 -C
- 浏览器 -B
UDP
UDP类似于发短信
需要用到Java提供的DatagramPacket类用于包裹数据、DatagramSocket类用于收发数据。
UDP实现传递信息
UDP中不区分服务端和客户端,双方都可以进行数据的接收和发送。
UDP不需要建立连接,所以没有简历连接、发送不成功也不会报错。
发送方
发送方要做的工作:
- 创建DatagramSocket对象
- 提供接收数据的对象IP及端口号
- 创建要发送数据的DatagramPacket对象,需要提供:数据、数据起止位置、接收对象信息
- 发送包对象
- 关闭资源
实现代码:
// 1.创建Socket对象
DatagramSocket datagramSocket = new DatagramSocket();
// 2.说明发送对象
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9090;
// 3.创建要发送数据的包对象,需要提供:数据、数据起止位置、发送对象
String msg = "say hi";
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, inetAddress, port);
// 4.发送包对象
datagramSocket.send(datagramPacket);
// 提示信息
System.out.println("Successfully send");
// 5.关闭资源
datagramSocket.close();
接收方
接收方要做的工作:
- 提供端口号,可供连接
- 创建要接收数据的包对象,需要提供:接收的容器、数据起止位置
- 接收数据包
- 输出接收到的数据
- 关闭资源
实现代码:
// 1.创建Socket对象,并提供端口号,可供连接
DatagramSocket datagramSocket = new DatagramSocket(9090);
// 2.创建要接收数据的包对象,需要提供:接收的容器、数据起止位置
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
// 3.接收数据包
datagramSocket.receive(datagramPacket); // 阻塞接收,程序会等待,直至接收到数据包
// 4.输出接收到的数据
System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
// 5.关闭资源
datagramSocket.close();
UDP持续传送接收消息
发送方
发送方要做的工作:
- 创建DatagramSocket对象
- 提供接收数据的对象IP及端口号,并创建一系列要用到的对象,如Scanner对象用于从命令行获取信息,DatagramPacket用于打包信息,准备发送。
- 循环接收消息并发送包含信息的数据包
- 输入bye关键字时退出循环
- 关闭资源,结束连接
代码实现:
// 1.创建socket对象
DatagramSocket datagramSocket = new DatagramSocket();
// 2.创建要用到的系列对象
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9999;
Scanner scanner = new Scanner(System.in);
String msg;
byte[] msgByte;
DatagramPacket datagramPacket;
// 循环输出消息
do {
// 3.提供数据,从控制台读取
msg = scanner.nextLine();
msgByte = msg.getBytes();
datagramPacket = new DatagramPacket(msgByte, 0, msgByte.length, inetAddress, port);
// 4.发送数据包
datagramSocket.send(datagramPacket);
} while (!msg.equals("bye"));
// 5.关闭资源
datagramSocket.close();
接收方
接收方要做的工作:
- 创建socket对象,并提供端口,可供通信
- 创建接收数据需要的系列对象
- 循环接收数据包
- 打印输出接收到的数据,收到bye关键字时退出循环
- 关闭资源,结束连接
代码实现:
// 1.创建socket对象,并提供端口,可供交互通信
DatagramSocket datagramSocket = new DatagramSocket(9999);
// 2.创建接收数据需要的系列对象
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
String received;
// 循环接收数据
do {
// 3.接收数据
datagramSocket.receive(datagramPacket);
// 将数据转换为String格式
received = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
// 打印输出
System.out.println(received);
} while (!received.equals("bye"));
// 4.关闭资源
datagramSocket.close();
UDP实现双方持续交互
通过多线程实现双方交互,两者都可以同时接收和发送消息。
发送消息线程
package xyz.lilmoon.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;
class SendMsg implements Runnable{
// 1.创建socket对象
DatagramSocket datagramSocket;
// 2.创建要用到的系列对象
String toIP;
int toPort;
Scanner scanner;
InetSocketAddress inetSocketAddress;
public SendMsg(String toIP, int toPort) throws Exception {
this.toIP = toIP;
this.toPort = toPort;
datagramSocket = new DatagramSocket();
scanner = new Scanner(System.in);
inetSocketAddress = new InetSocketAddress(toIP, toPort);
}
@Override
public void run() {
String msg;
byte[] msgByte;
DatagramPacket datagramPacket;
do {
msg = scanner.nextLine();
msgByte = msg.getBytes();
datagramPacket = new DatagramPacket(msgByte, 0, msgByte.length, inetSocketAddress);
try {
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
} while (!msg.equals("bye"));
}
}
接收消息线程
package xyz.lilmoon.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
class ReceiveMsg implements Runnable{
DatagramSocket datagramSocket;
int openPort;
public ReceiveMsg(int openPort) throws SocketException {
this.openPort = openPort;
datagramSocket = new DatagramSocket(openPort);
}
@Override
public void run() {
// 创建接收数据需要的系列对象
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
String received;
// 循环接收数据
do {
// 接收数据
try {
datagramSocket.receive(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
// 将数据转换为String格式
received = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
// 打印输出
System.out.println(datagramPacket.getAddress().getHostName() + "说:" + received);
} while (!received.equals("bye"));
}
}
交互双方
双方只需提供对方的IP及端口号,然后创建并启动线程即可
实现代码:
Scanner scanner = new Scanner(System.in);
// 提示信息
System.out.print("请输入对方的IP:");
String toIP = scanner.next();
// 提示信息
System.out.print("请输入对方的端口号:");
int toPort = scanner.nextInt();
new Thread(new SendMsg(toIP, toPort)).start();
new Thread(new ReceiveMsg(6666)).start();
System.out.println("连接成功,可以开始发送消息了");
URL
统一资源定位符,定义互联网上的某一个资源
协议://ip地址:端口号/项目名/资源
Java提供了URL类
URL url = new URL("http://localhost:8080/Java/未命.txt");
URL类常用方法
System.out.println(url.getProtocol()); // 获得协议名
System.out.println(url.getHost()); // 主机
System.out.println(url.getPort()); // 端口
System.out.println(url.getPath()); // 文件
System.out.println(url.getFile()); // 文件全路径
System.out.println(url.getQuery()); // 参数
通过URL下载文件
下载文件步骤:
- 提供下载链接
- 建立HTTP连接
- 创建下载所需的输入流和文件输出流,以及其他要用的容器
- 读取数据并写出到文件中
- 关闭资源
代码实现:
// 1.获取下载地址
URL url = new URL("http://localhost:8080/Java/test.txt");
// 2.连接到这个资源(HTTP)
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
// 3.创建下载的输入流和文件输出流以及其他要用的容器
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("down.m4a");
byte[] buffer = new byte[1024];
int len;
// 写出数据
while ((len = inputStream.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
// 4.关闭资源
fos.close();
inputStream.close();
urlConnection.disconnect(); // 断开连接