十一, 网络编程

1. 什么是网络编程

  1. 网络编程: 在网络通信协议下, 计算机和计算机之间通过网络进行数据的传输

  2. Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序

  3. 常见的软件架构:

    • C/S: Client/Server客户端/服务器, 在用户本地需要下载并安装客户端程序, 在远程有一个服务器端程序
    • B/S: Browser/Server浏览器/服务器, 只需要一个浏览器, 用户通过不同的网址, 客户访问不同的服务器
  4. B/S架构的优缺点:

    • 优点: (1) 不需要开发客户端, 只需要页面+服务端 (2) 用户不需要下载, 打开浏览器就能使用
    • 缺点: 如果应用过大, 用户体验受到影响
  5. C/S架构的优缺点:

    • 优点: 画面可以做的非常精美, 用户体验好
    • 缺点: (1) 既需要开发客户端, 又需要开发服务端 (2) 用户需要下载和更新的时候太麻烦

2. 网络编程三要素

  1. IP: 设备在网络中的地址, 也是唯一的标识
  2. 端口号: 应用程序在设备中唯一的标识
  3. 协议: 数据在网络中的传输规则, 常见的协议有: UDP, TCP, http, https, ftp
  4. 特殊的IP: 127.0.0.1永远表示本机
  5. ipconfig: 查看本机IP地址, ping: 检查网络是否畅通

3. Java中InetAddress

image

4. UDP通信工程

image

  1. 发送数据
        // 发送数据
        // 1. 创建DatagramSocket对象(快递公司)
        // 绑定端口: 以后就是通过这个端口往外发送
        // 空参: 随机端口 有参: 指定端口号进行绑定
        DatagramSocket ds = new DatagramSocket();

        // 2. 打包数据
        byte[] bys = "hello,udp".getBytes();
        InetAddress byName = InetAddress.getByName("127.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bys, bys.length, byName, port);

        // 3. 发送数据
        ds.send(dp);
        // 4. 释放资源
        ds.close();
  1. 接收数据
    image
        // 接收数据
        // 1. 创建DatagramSocket对象(快递公司)
        // 接收的时候一定要绑定端口
        // 绑定的端口一定要跟发送的端口保持一致
        DatagramSocket ds = new DatagramSocket(10086);

        // 2. 接收数据包
        byte [] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);
        ds.receive(dp);

        // 3. 解析数据包
        String data = new String(dp.getData(), 0, dp.getLength());
        System.out.println(data);
        // 4. 释放资源
        ds.close();

5. TCP通信工程

image
image

5.1 TCP发送数据

package awei.itheima;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        // TCP协议, 发送数据
        // 1. 创建socket对象
        // 细节: 在创建对象同时会连接服务器, 如果连接不上, 会报错
        Socket socket = new Socket("127.0.0.1", 10000);

        // 2. 可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        // 写出数据
        os.write("hello, server你好".getBytes()); // 中文会出现乱码, 如果接收端是字节流读入的话

        // 3. 释放资源
        os.close();
        socket.close();

    }
}

5.2 TCP接收数据

package awei.itheima;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        // TCP协议, 接收数据
        // 1. 创建对象ServerSocket
        ServerSocket ss =  new ServerSocket(10000);
        // 2. 监听客户端的连接
        Socket socket = ss.accept();
        // 3. 从连接通道中获取输入流读取数据
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        // 使用缓冲流提高效率
//        BufferedReader br = new BufferedReader(isr);
        int b;
//        while((b = is.read()) != -1){
//            System.out.print((char)b);
//        }
        while((b = isr.read()) != -1){
            System.out.print((char)b);
        }
        // 4. 释放资源(释放端口和服务器, 输入流不需要, 因为断开连接时候会默认把输入输出流断开)
        socket.close();
        ss.close();
    }
}

5.3 客户端和服务端建立连接原理

5.3.1 先服务端, 后客户端

  1. 先运行服务端, 等待客户端请求, 再运行客户端
    image

5.3.2 TCP通信程序(三次握手)

image

5.3.3 TCP通信程序(四次挥手)

  1. 确保连接通道里面的数据完全处理
    image
posted @ 2025-08-15 10:12  awei040519  阅读(12)  评论(0)    收藏  举报