Java网络编程详解:从基础到实践
网络编程是现代软件开发中不可或缺的一部分。在Java中,我们可以通过多种方式实现网络通信,其中最常用的是UDP和TCP协议。本文将详细介绍Java网络编程的基础知识、UDP和TCP编程的核心概念和实现方法。
网络编程概述
计算机网络定义
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程定义
网络编程是指实现网络互连的不同计算机上运行的程序间可以进行数据交换的技术。
网络模型
网络模型定义了计算机网络之间以何种规则进行通信。常见的网络模型包括OSI(Open System Interconnection开放系统互连)参考模型和TCP/IP参考模型。
OSI参考模型
OSI模型将网络通信分为七层:
- 应用层:为应用软件提供网络服务。
- 表示层:数据格式转换、数据加密解密等。
- 会话层:建立、管理和终止应用程序之间的会话。
- 传输层:提供端到端的通信服务,确保数据完整性。
- 网络层:负责数据包的寻址和路由。
- 数据链路层:在相邻节点间提供数据传输。
- 物理层:传输原始的比特流。
TCP/IP参考模型
TCP/IP模型是互联网的基础,它简化了OSI模型,通常分为四层:
- 应用层:对应OSI模型的应用层、表示层和会话层。
- 传输层:对应OSI模型的传输层。
- 网际层:对应OSI模型的网络层。
- 主机至网络层:对应OSI模型的数据链路层和物理层。
网络通信三要素
IP地址
IP地址是网络中设备的标识,类似于电话号码。在TCP/IP协议中,IP地址用于指定要接受数据的计算机和识别发送的计算机。Java提供了InetAddress
类来方便我们对IP地址的获取和操作。
InetAddress类的使用
import java.net.InetAddress;
public class InetAddressExample {
public static void main(String[] args) throws Exception {
// 获取任意主机的IP地址
InetAddress addr = InetAddress.getByName("www.example.com");
System.out.println("Host Name: " + addr.getHostName());
System.out.println("IP Address: " + addr.getHostAddress());
}
}
端口号
端口号用于标识进程的逻辑地址,不同进程的标识。有效端口范围是065535,其中01024为系统使用或保留端口。我们可以通过netstat -ano
命令查看端口号。
传输协议
传输协议定义了通信的规则。常见的协议包括TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。
UDP编程
UDP是一种无连接的协议,它将数据源和目的封装成数据包中,不需要建立连接。UDP的特点是速度快,但不可靠。
UDP传输流程
- 建立UDP的
DatagramSocket
服务。 - 通过
receive
方法接收数据。 - 将收到的数据存储到
DatagramPacket
对象中。 - 通过
DatagramPacket
对象的功能对接收到的数据进行解析。 - 关闭资源。
UDP发送端代码示例
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.DatagramPacket;
public class UDPSender {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
String message = "Hello UDP";
byte[] buf = message.getBytes();
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9876);
socket.send(packet);
socket.close();
}
}
UDP接收端代码示例
import java.net.DatagramSocket;
import java.net.DatagramPacket;
public class UDPReceiver {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9876);
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Received: " + received);
socket.close();
}
}
TCP编程
TCP是一种面向连接的协议,它在数据传输前需要建立连接,并在连接中进行数据传输。
TCP传输流程
- 建立客户端的
Socket
服务,并明确要连接的服务器。 - 如果连接建立成功,就表明已经建立了数据传输的通道。就可以在该通道通过IO进行数据的读取和写入。该通道称为Socket流,Socket流中既有读取流,也有写入流。
- 通过
Socket
对象的方法,可以获取这两个流。 - 通过流的对象可以对数据进行传输。
- 如果传输数据完毕,关闭资源。
TCP客户端代码示例
import java.net.Socket;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.PrintStream;
public class TCPClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 9876);
OutputStream out = socket.getOutputStream();
PrintStream p = new PrintStream(out);
p.println("Hello TCP Client");
InputStream in = socket.getInputStream();
int i;
while ((i = in.read()) != -1) {
System.out.print((char) i);
}
socket.close();
}
}
TCP服务器端代码示例
import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.PrintStream;
public class TCPServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9876);
Socket socket = serverSocket.accept();
OutputStream out = socket.getOutputStream();
PrintStream p = new PrintStream(out);
p.println("Hello TCP Server");
InputStream in = socket.getInputStream();
int i;
while ((i = in.read()) != -1) {
System.out.print((char) i);
}
socket.close();
serverSocket.close();
}
}
总结
网络编程是现代软件开发中的一项基本技能。通过本文的介绍,你应该已经了解了网络编程的基本概念、UDP和TCP协议的工作原理以及如何在Java中实现这些协议的编程。无论是UDP的无连接通信还是TCP的面向连接通信,Java都提供了强大的API来支持这些操作。掌握这些知识,你将能够开发出功能强大的网络应用程序。
标签:UDP,java,socket,编程,TCP,import From: https://www.cnblogs.com/bjynjj/p/18490374