21.java 网络通信
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(传输控制协议):
-  Socket编程: - Java提供了Socket和ServerSocket类,用于实现TCP套接字通信。
- Socket类用于客户端,而- ServerSocket类用于服务器端。
 
- Java提供了
-  可靠性: - TCP是一种面向连接的协议,提供可靠的、有序的、双向的字节流传输。
- 通过使用三次握手建立连接和四次握手终止连接,确保数据的可靠传输。
 
-  阻塞式: - TCP通信是阻塞式的,意味着当一个线程在读取或写入数据时,它会阻塞直到操作完成。
 
-  应用场景: - 适用于对数据传输可靠性要求较高的场景,如文件传输、电子邮件等。
 
例子
客户端代码:
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(用户数据报协议):
-  DatagramSocket: - Java中使用DatagramSocket和DatagramPacket类来实现UDP套接字通信。
 
- Java中使用
-  无连接: - UDP是一种无连接的协议,每个数据报都是独立的,没有像TCP那样的连接和终止的过程。
 
-  不可靠性: - UDP不保证数据传输的可靠性,也不保证数据的有序性。因此,它更适用于实时应用,如音频和视频流。
 
-  非阻塞式: - UDP通信是非阻塞式的,因为它不会像TCP那样等待连接的建立。
 
-  应用场景: - 适用于对实时性要求高、能够容忍一定数据丢失的场景,如在线游戏、实时通信等。
 
- 例题
- 发送数据
-  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(); // 阻塞等待客户端连接服务端套接字: 用于创建服务器套接字,监听客户端的连接请求。 
-  网络通信的生命周期:
- 建立连接: 通过Socket或ServerSocket建立连接。
- 数据传输: 使用InputStream和OutputStream进行数据传输。
- 关闭连接: 使用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中,可以使用Socket和ServerSocket类来实现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中,可以使用DatagramSocket和DatagramPacket类来实现UDP网络通信。以下是一个简单的UDP网络程序设计的基本步骤:
服务器端设计:
创建DatagramSocket:
 
 
    		本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!