21.java 网络通信

2023-12-13 12:08:24

A.网络程序设计基础

????????局域网与互联网

????????局域网(LAN)中的 Java 应用程序:

  • 通信: 在局域网中,Java 应用程序可以使用各种通信协议进行通信,如TCP/IP和UDP。Java 的 Socket API 提供了一种方便的方式来实现网络通信。
  • RMI(远程方法调用): Java 的 RMI 允许在不同的 Java 虚拟机之间进行方法调用,这对于在局域网环境中构建分布式系统非常有用。

????????网络协议

????????1.IP协议

ICMP(Internet Control Message Protocol):

  • ICMP 是 IP 协议的一个重要组成部分,用于在 IP 网络上发送错误消息和操作消息,例如 Ping 命令就是使用 ICMP 来检测目标设备是否可达。
????????2.TCP与UDP协议

TCP(传输控制协议):

  1. Socket编程:

    • Java提供了SocketServerSocket类,用于实现TCP套接字通信。
    • Socket类用于客户端,而ServerSocket类用于服务器端。
  2. 可靠性:

    • TCP是一种面向连接的协议,提供可靠的、有序的、双向的字节流传输。
    • 通过使用三次握手建立连接和四次握手终止连接,确保数据的可靠传输。
  3. 阻塞式:

    • TCP通信是阻塞式的,意味着当一个线程在读取或写入数据时,它会阻塞直到操作完成。
  4. 应用场景:

    • 适用于对数据传输可靠性要求较高的场景,如文件传输、电子邮件等。

例子

客户端代码:

Socket socket = new Socket("localhost", 8080);
OutputStream out = socket.getOutputStream();
out.write("Hello, Server!".getBytes());
socket.close();

服务器端代码:

ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
// 读取数据并进行处理
serverSocket.close();

UDP(用户数据报协议):

  1. DatagramSocket:

    • Java中使用DatagramSocketDatagramPacket类来实现UDP套接字通信。
  2. 无连接:

    • UDP是一种无连接的协议,每个数据报都是独立的,没有像TCP那样的连接和终止的过程。
  3. 不可靠性:

    • UDP不保证数据传输的可靠性,也不保证数据的有序性。因此,它更适用于实时应用,如音频和视频流。
  4. 非阻塞式:

    • UDP通信是非阻塞式的,因为它不会像TCP那样等待连接的建立。
  5. 应用场景:

    • 适用于对实时性要求高、能够容忍一定数据丢失的场景,如在线游戏、实时通信等。
  6. 例题
  7. 发送数据
  8. DatagramSocket socket = new DatagramSocket();
    byte[] data = "Hello, Server!".getBytes();
    DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 8080);
    socket.send(packet);
    socket.close();
    

接收数据

DatagramSocket socket = new DatagramSocket(8080);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
// 处理接收到的数据
socket.close();

端口与套接字

端口:

  • 定义: 端口是一个16位的数字,范围从0到65535。它用于标识网络中的应用程序。
  • 作用: 在一个主机上,不同的端口用于不同的网络服务或应用程序,以便在同一时间可以通过同一IP地址进行多个不同的网络通信。

. 套接字(Socket):

  • 定义: 套接字是一种通信机制,允许计算机上的不同进程通过网络进行通信。在Java中,Socket类和ServerSocket类用于实现套接字通信。
  • 作用: 套接字提供了一个抽象层,使得程序可以通过网络发送和接收数据,实现进程之间的通信。

Socket类:

  • 客户端套接字: 用于创建客户端套接字,与服务器进行通信
  • Socket socket = new Socket("服务器IP", 端口号);
    
    ServerSocket serverSocket = new ServerSocket(端口号);
    Socket clientSocket = serverSocket.accept(); // 阻塞等待客户端连接
    

    服务端套接字: 用于创建服务器套接字,监听客户端的连接请求。

  • 网络通信的生命周期:

  • 建立连接: 通过SocketServerSocket建立连接。
  • 数据传输: 使用InputStreamOutputStream进行数据传输。
  • 关闭连接: 使用close()方法关闭套接字连接。

B.TCP程序

InetAddress类

例题1

获取 InetAddress 实例:

1.1 根据主机名获取 InetAddress 实例:

String host = "www.example.com";
InetAddress address = InetAddress.getByName(host);
?

2 根据 IP 地址获取 InetAddress 实例:

byte[] ipAddress = new byte[]{127, 0, 0, 1};
InetAddress address = InetAddress.getByAddress(ipAddress);
获取本机 InetAddress 实例:

InetAddress localhost = InetAddress.getLocalHost();
?

ServerSocket类

ServerSocket 类是 Java 中用于实现服务器套接字的类,它位于 java.net 包中。ServerSocket 用于监听客户端的连接请求,并在成功连接时创建一个对应的 Socket 实例,使得服务器能够与客户端进行通信。

创建 ServerSocket 实例:

import java.io.IOException;
import java.net.ServerSocket;

public class MyServer {
    public static void main(String[] args) {
        try {
            // 创建 ServerSocket 实例并指定端口号
            int port = 8080;
            ServerSocket serverSocket = new ServerSocket(port);
            
            System.out.println("Server is listening on port " + port);

            // 服务器代码,接受客户端连接
            // Socket clientSocket = serverSocket.accept();
            // 这里通常需要在循环中调用 accept(),以接受多个客户端的连接
            // 处理连接后,可以在新线程中继续处理客户端的请求

            // 关闭 ServerSocket
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
????????

accept() 方法:

accept() 方法是 ServerSocket 类的一个阻塞方法,用于监听客户端的连接请求。当有客户端连接时,accept() 方法返回一个新的 Socket 实例,该实例用于与客户端进行通信

Socket clientSocket = serverSocket.accept();
?

ServerSocket类的常用方法
设置服务器的绑定地址

serverSocket = new ServerSocket(port, backlog, bindAddr);
获取本地端口:int localPort = serverSocket.getLocalPort();
例子

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

public class MyServer {
    public static void main(String[] args) {
        try {
            // 创建 ServerSocket 实例并指定端口号
            int port = 8080;
            ServerSocket serverSocket = new ServerSocket(port);
            
            System.out.println("Server is listening on port " + port);

            // 循环接受客户端连接
            while (true) {
                // 阻塞等待客户端连接
                Socket clientSocket = serverSocket.accept();

                // 在新线程中处理客户端连接
                Thread clientThread = new Thread(() -> {
                    try {
                        // 处理客户端连接的业务逻辑
                        // ...

                        // 关闭客户端套接字
                        clientSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });

                // 启动新线程处理客户端连接
                clientThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

?TCP网络程序设计

设计TCP(Transmission Control Protocol)网络程序通常涉及到客户端和服务器之间的通信。在Java中,可以使用SocketServerSocket类来实现TCP网络通信。

服务器端设计:

?创建ServerSocket:

客户端设计:

C.UDP程序

DatagramPacket类

DatagramPacket 类是 Java 中用于实现 UDP(User Datagram Protocol)通信的类,它封装了数据报文(Datagram)以进行数据的发送和接收。DatagramPacket 类提供了构造方法和方法,用于在网络上发送和接收数据。

DatagramSocket类

DatagramSocket 类是 Java 中用于实现 UDP(User Datagram Protocol)通信的类,它提供了创建 UDP 套接字(socket)的功能,用于在网络上传输数据报文。DatagramSocket 类的实例可以用于发送和接收 UDP 数据报文。

UDP网络程序设计

设计UDP(User Datagram Protocol)网络程序通常涉及到客户端和服务器之间的无连接通信。在Java中,可以使用DatagramSocketDatagramPacket类来实现UDP网络通信。以下是一个简单的UDP网络程序设计的基本步骤:

服务器端设计:

创建DatagramSocket

文章来源:https://blog.csdn.net/m0_74831526/article/details/134862632
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。