Java.Network02

初识Tomcat

服务端

  • 通过JDK提供的类和方法实现 -S
  • Tomcat -S 常用语Java后台开发

客户端

  • 通过JDK提供的类和方法实现 -C
  • 浏览器 -B

UDP

UDP类似于发短信
需要用到Java提供的DatagramPacket类用于包裹数据、DatagramSocket类用于收发数据。

UDP实现传递信息

UDP中不区分服务端和客户端,双方都可以进行数据的接收和发送。
UDP不需要建立连接,所以没有简历连接、发送不成功也不会报错。

发送方

发送方要做的工作:

  1. 创建DatagramSocket对象
  2. 提供接收数据的对象IP及端口号
  3. 创建要发送数据的DatagramPacket对象,需要提供:数据、数据起止位置、接收对象信息
  4. 发送包对象
  5. 关闭资源

实现代码:

// 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. 提供端口号,可供连接
  2. 创建要接收数据的包对象,需要提供:接收的容器、数据起止位置
  3. 接收数据包
  4. 输出接收到的数据
  5. 关闭资源

实现代码:

// 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持续传送接收消息

发送方

发送方要做的工作:

  1. 创建DatagramSocket对象
  2. 提供接收数据的对象IP及端口号,并创建一系列要用到的对象,如Scanner对象用于从命令行获取信息,DatagramPacket用于打包信息,准备发送。
  3. 循环接收消息并发送包含信息的数据包
  4. 输入bye关键字时退出循环
  5. 关闭资源,结束连接

代码实现:

// 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();

接收方

接收方要做的工作:

  1. 创建socket对象,并提供端口,可供通信
  2. 创建接收数据需要的系列对象
  3. 循环接收数据包
  4. 打印输出接收到的数据,收到bye关键字时退出循环
  5. 关闭资源,结束连接

代码实现:

// 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下载文件

下载文件步骤:

  1. 提供下载链接
  2. 建立HTTP连接
  3. 创建下载所需的输入流和文件输出流,以及其他要用的容器
  4. 读取数据并写出到文件中
  5. 关闭资源

代码实现:

// 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();     // 断开连接
tag(s):
show comments · back · home