👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
一、什么是网络编程
Java的网络编程是指使用Java语言进行网络通信的编程技术。在Java中,可以使用Socket和ServerSocket类来实现基于TCP协议的网络通信,也可以使用DatagramSocket和DatagramPacket类来实现基于UDP协议的网络通信。
Java的网络编程可以用于开发各种网络应用程序,例如Web应用程序、客户端/服务器应用程序、网络游戏等。在网络编程中,Java提供了丰富的类库和API,可以方便地进行网络通信的开发和调试。
Java的网络编程涉及到许多概念和技术,例如IP地址、端口号、套接字、协议等。要进行Java网络编程,需要掌握这些基本概念和技术,并熟练掌握Java的网络编程类库和API。
二、网络编程的三要素
Java网络编程的三要素是:IP地址、端口号和协议。
- IP地址:IP地址是网络中用于标识设备的唯一地址。在Java网络编程中,可以使用InetAddress类来表示IP地址,例如:
InetAddress address = InetAddress.getByName("www.jiliu.com");
- 端口号:端口号是用于标识网络中进程的唯一标识符,它是一个16位的整数。在Java网络编程中,可以使用Socket类来建立网络连接,并指定端口号,例如:
Socket socket = new Socket("www.example.com", 80);
- 协议:协议是网络中进行通信的规则和标准。在Java网络编程中,可以使用Socket类和ServerSocket类来实现基于TCP协议的网络通信,也可以使用DatagramSocket类和DatagramPacket类来实现基于UDP协议的网络通信,例如:
// 基于TCP协议的网络通信
Socket socket = new Socket("www.example.com", 80);
ServerSocket serverSocket = new ServerSocket(8080);
// 基于UDP协议的网络通信
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket = new DatagramPacket(data, length, address, port);
掌握了IP地址、端口号和协议这三个要素,就可以使用Java进行网络编程了。
三、ip地址 (ipv4, ipv6)
Java中的IP地址可以使用InetAddress类来表示,支持IPv4和IPv6两种类型的IP地址。下面是使用Java获取IPv4和IPv6地址的示例代码:
- 获取本地IPv4地址:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) {
try {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("本地IPv4地址: " + localHost.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
- 获取本地IPv6地址:
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) {
try {
InetAddress localHost = InetAddress.getLocalHost();
if (localHost instanceof Inet6Address) {
System.out.println("本地IPv6地址: " + localHost.getHostAddress());
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
- 获取指定域名的IPv4和IPv6地址:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) {
try {
InetAddress[] addresses = InetAddress.getAllByName("www.jiliu.com");
for (InetAddress address : addresses) {
if (address instanceof Inet6Address) {
System.out.println("IPv6地址: " + address.getHostAddress());
} else {
System.out.println("IPv4地址: " + address.getHostAddress());
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
使用 getLocalHost()
方法获取本地主机的IP地址,使用 getAllByName()
方法获取指定域名的IP地址。根据返回的 InetAddress
对象类型判断是IPv4还是IPv6地址,然后通过 getHostAddress()
方法获取地址字符串表示。
四、端口和协议的详细解释
在Java网络编程中,端口和协议是两个重要的概念。
- 端口:
端口是用于标识网络中特定应用程序或服务的数字。在TCP/IP协议中,端口号是一个16位的整数,范围从0到65535。其中,0到1023的端口号称为"知名端口",用于一些常见的网络服务,如HTTP(端口号为80)、FTP(端口号为21)等。而1024到65535的端口号称为"动态端口",用于临时分配给客户端程序使用。
在Java中,可以使用Socket类和ServerSocket类来指定端口号进行网络通信。例如,创建一个Socket对象时可以指定目标主机和端口号:
Socket socket = new Socket("www.jiliu.com", 8080);
创建一个ServerSocket对象时可以指定端口号:
ServerSocket serverSocket = new ServerSocket(8080);
- 协议:
协议是网络通信中规定的一系列规则和约定,用于确保数据在网络中的传输和交换。在Java网络编程中,常用的协议有TCP(传输控制协议)和UDP(用户数据报协议)。
五、传输的协议
Java中常用的传输协议有TCP(传输控制协议)和UDP(用户数据报协议)。
- TCP协议:
TCP是一种可靠的、面向连接的协议。在TCP通信中,数据被分割成小的数据包,通过网络传输,并在接收端重新组装。TCP协议提供了数据的可靠性、顺序性和流量控制等功能,适用于对数据传输质量要求较高的场景,如文件传输、Web应用等。
在Java中,可以使用Socket类和ServerSocket类实现TCP协议的通信。Socket类用于客户端,可以创建一个Socket对象,指定目标主机和端口号进行连接。ServerSocket类用于服务器端,可以创建一个ServerSocket对象,指定端口号监听客户端的连接请求。
- UDP协议:
UDP是一种不可靠的、无连接的协议。在UDP通信中,数据以数据报的形式发送,每个数据报都是独立的,可能会丢失、重复或乱序。UDP协议不提供数据的可靠性和顺序性,但传输效率高,适用于对实时性要求较高、数据丢失可以容忍的场景,如音视频传输、游戏等。
在Java中,可以使用DatagramSocket类和DatagramPacket类实现UDP协议的通信。DatagramSocket类用于发送和接收数据报,可以创建一个DatagramSocket对象,指定端口号进行通信。DatagramPacket类用于封装数据报,包括数据和目标主机的地址信息。
六、UDP协议中广播与组播
在UDP协议中,有两种常见的多播方式,即广播(Broadcast)和组播(Multicast)。
- **广播(Broadcast)**:
广播是一种将数据包发送给网络中所有主机的方式。在UDP广播中,数据包被发送到一个特定的广播地址,该地址是网络中所有主机都能接收到的地址。广播地址通常是特定的IP地址,如IPv4的255.255.255.255或IPv6的ff02::1。
在Java中,可以使用DatagramSocket类来实现UDP广播。首先,需要创建一个DatagramSocket对象,并将其绑定到本地主机的一个端口上。然后,创建一个DatagramPacket对象,将要发送的数据和广播地址封装进去。最后,使用DatagramSocket的send方法将数据包发送出去。
下面是一个简单的Java代码示例,用于实现UDP广播:
import java.net.*;
public class UDPBroadcastSender {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(true);
byte[] data = "Hello, broadcast!".getBytes();
InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
DatagramPacket packet = new DatagramPacket(data, data.length, broadcastAddress, 8888);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- **组播(Multicast)**:
组播是一种将数据包发送给特定组内的主机的方式。在UDP组播中,数据包被发送到一个特定的组播地址,只有加入该组播组的主机才能接收到数据包。组播地址是一个特定的IP地址范围,如IPv4的224.0.0.0到239.255.255.255或IPv6的ff00::/8。
在Java中,可以使用MulticastSocket类来实现UDP组播。首先,需要创建一个MulticastSocket对象,并将其绑定到一个组播地址和端口上。然后,使用joinGroup方法加入组播组。最后,创建一个DatagramPacket对象,将要发送的数据和组播地址封装进去,并使用MulticastSocket的send方法将数据包发送出去。
下面是一个简单的Java代码示例,用于实现UDP组播:
import java.net.*;
public class UDPMulticastSender {
public static void main(String[] args) {
try {
MulticastSocket socket = new MulticastSocket();
InetAddress multicastAddress = InetAddress.getByName("224.0.0.1");
int port = 8888;
socket.joinGroup(multicastAddress);
byte[] data = "Hello, multicast!".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, multicastAddress, port);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意,接收广播和组播的主机需要相应的配置和权限,以便正确接收和处理数据包。
七、TCP协议发送与接收数据
TCP协议是一种可靠的、面向连接的协议,用于在网络上发送和接收数据。TCP协议提供了一种可靠的、有序的、基于字节流的通信方式。
在TCP协议中,发送方和接收方之间首先建立一个连接。连接的建立过程称为"三次握手"。一旦连接建立成功,发送方就可以通过该连接向接收方发送数据。
发送数据:
- 创建一个TCP套接字(Socket)对象。
- 使用Socket对象的connect()方法连接到目标主机和端口。
- 创建一个输出流(OutputStream)对象,通过该流向Socket发送数据。
- 使用输出流的write()方法将数据发送给接收方。
- 关闭输出流和Socket连接。
接收数据:
- 创建一个TCP套接字(Socket)对象。
- 使用Socket对象的bind()方法绑定到一个本地地址和端口。
- 使用Socket对象的accept()方法监听来自发送方的连接请求,并接受连接。
- 创建一个输入流(InputStream)对象,通过该流接收Socket发送的数据。
- 使用输入流的read()方法读取接收到的数据。
- 关闭输入流、Socket连接和监听的套接字。
Java代码示例,演示如何使用TCP协议发送和接收数据:
发送方代码:
import java.io.OutputStream;
import java.net.Socket;
public class TCPSender {
public static void main(String[] args) {
try {
String serverIP = "192.168.0.100";
int serverPort = 8888;
Socket socket = new Socket(serverIP, serverPort);
OutputStream outputStream = socket.getOutputStream();
String message = "Hello, TCP!";
outputStream.write(message.getBytes());
outputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收方代码:
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPReceiver {
public static void main(String[] args) {
try {
int serverPort = 8888;
ServerSocket serverSocket = new ServerSocket(serverPort);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytesRead);
System.out.println("Received message: " + receivedMessage);
inputStream.close();
socket.close();
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
💕💕 本文由激流原创,原创不易,希望大家关注、点赞、收藏,给博主一点鼓励,感谢!!!