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进行投诉反馈,一经查实,立即删除!