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(传输控制协议):

  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. 发送数据

复制代码
   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
相关推荐
小龙报几秒前
《C语言疑难点 --- C语内存函数专题》
c语言·开发语言·c++·创业创新·学习方法·业界资讯·visual studio
TDengine (老段)6 分钟前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
心随雨下25 分钟前
Tomcat日志配置与优化指南
java·服务器·tomcat
Kapaseker31 分钟前
Java 25 中值得关注的新特性
java
wljt35 分钟前
Linux 常用命令速查手册(Java开发版)
java·linux·python
撩得Android一次心动38 分钟前
Android 四大组件——BroadcastReceiver(广播)
android·java·android 四大组件
canonical_entropy41 分钟前
Nop平台到底有什么独特之处,它能用在什么场景?
java·后端·领域驱动设计
chilavert31844 分钟前
技术演进中的开发沉思-174 java-EJB:分布式通信
java·分布式
国服第二切图仔1 小时前
Rust开发实战之简单游戏开发(piston游戏引擎)
开发语言·rust·游戏引擎
ii_best1 小时前
安卓/IOS工具开发基础教程:按键精灵一个简单的文字识别游戏验证
android·开发语言·游戏·ios·编辑器