Java中的网络编程主要涉及使用Socket类进行网络通信,以及理解各种网络协议。以下是一些关键概念和示例代码,帮助您入门。
1. 网络协议
Java支持多种网络协议,最常用的包括:
- TCP(传输控制协议):面向连接的协议,确保数据的可靠传输。
- UDP(用户数据报协议):无连接的协议,适用于对速度要求高但对可靠性要求低的应用。
网络通信模型通常指的是OSI(开放系统互联)模型,它将网络通信分为七个层次。每一层都有特定的功能和协议。以下是OSI模型的七层及其简要说明:
物理层 (Physical Layer)
- 功能:负责传输原始比特流,定义物理连接的电气、机械和程序特性。
- 设备:网卡、集线器、调制解调器、光纤等。
数据链路层 (Data Link Layer)
- 功能:提供节点之间的可靠数据传输,处理错误检测和纠正,管理帧的传输。
- 协议:Ethernet、PPP、HDLC等。
网络层 (Network Layer)
- 功能:负责数据包的路由选择和转发,处理逻辑地址(如IP地址)。
- 协议:IP(Internet Protocol)、ICMP、IGMP等。
传输层 (Transport Layer)
- 功能:提供端到端的通信,确保数据完整性和顺序,处理流量控制和错误恢复。
- 协议:TCP(Transmission Control Protocol)、UDP(User Datagram Protocol)。
会话层 (Session Layer)
- 功能:管理会话的建立、维护和终止,处理会话恢复和同步。
- 协议:RPC(Remote Procedure Call)、NetBIOS等。
表示层 (Presentation Layer)
- 功能:负责数据格式的转换、加密和解密,确保数据在不同系统间的可读性。
- 协议:JPEG、MPEG、SSL/TLS等。
应用层 (Application Layer)
- 功能:为用户提供网络服务,处理应用程序与网络之间的交互。
- 协议:HTTP、FTP、SMTP、DNS等。
2. Socket编程
Socket编程是Java网络编程的核心,主要分为客户端和服务器端。
服务器端示例
import java.io.*;
import java.net.*; public class SimpleServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(12345)) { System.out.println("服务器正在监听端口 12345..."); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("客户端已连接: " + clientSocket.getInetAddress()); new Thread(new ClientHandler(clientSocket)).start(); } } catch (IOException e) { e.printStackTrace(); } }
} class ClientHandler implements Runnable { private Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) { String message; while ((message = in.readLine()) != null) { System.out.println("收到消息: " + message); out.println("回声: " + message); } } catch (IOException e) { e.printStackTrace(); } }
}
客户端示例
import java.io.*;
import java.net.*; public class SimpleClient { public static void main(String[] args) { try (Socket socket = new Socket("localhost", 12345); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) { out.println("你好,服务器!"); String response = in.readLine(); System.out.println("服务器响应: " + response); } catch (IOException e) { e.printStackTrace(); } }
}
3. 运行示例
- 首先,运行服务器端代码,它会在端口12345上监听客户端连接。
- 然后,运行客户端代码,它会连接到服务器并发送一条消息。