第14章 网络编程
网络编程概述
什么是网络编程?
- 网络编程是通过网络协议实现计算机之间的数据交换。
- Java提供了强大的网络编程支持,隐藏了底层细节,开发者可以轻松实现网络通信。
网络编程的核心问题
- 如何定位网络上的主机:通过IP地址和端口号。
- 如何高效传输数据:通过协议(如TCP、UDP)进行数据传输。
网络通信要素概述
通信要素
- IP地址:唯一标识网络中的主机。
- 端口号:标识主机上的应用程序。
- 网络协议:规定数据传输的规则。
网络协议分层
- OSI参考模型:理论模型,分为7层。
- TCP/IP参考模型:实际应用中的4层模型。
OSI模型 | TCP/IP模型 | 协议示例 |
---|---|---|
应用层 | 应用层 | HTTP、FTP、DNS |
传输层 | 传输层 | TCP、UDP |
网络层 | 网络层 | IP、ICMP |
数据链路层 | 物理+数据链路层 | Ethernet、Wi-Fi |
通信要素1:IP和端口号
IP地址
- IPv4 :4个字节,如
192.168.1.1
。 - IPv6 :16个字节,如
3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
。
端口号
- 范围:0~65535。
- 分类 :
- 公认端口:0~1023(如HTTP的80端口)。
- 注册端口:1024~49151(如Tomcat的8080端口)。
- 动态端口:49152~65535。
InetAddress类
- 功能:表示IP地址,支持域名解析。
- 常用方法 :
getHostName()
:获取主机名。getHostAddress()
:获取IP地址。
java
InetAddress address = InetAddress.getByName("www.atguigu.com");
System.out.println(address.getHostName()); // 输出域名
System.out.println(address.getHostAddress()); // 输出IP地址
通信要素2:网络协议
TCP vs UDP
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接,可靠 | 无连接,不可靠 |
数据大小 | 无限制 | 最大64KB |
速度 | 较慢 | 较快 |
应用场景 | 文件传输、邮件 | 视频流、在线游戏 |
TCP三次握手
- 客户端发送
SYN
报文。 - 服务器回复
SYN+ACK
报文。 - 客户端发送
ACK
报文,连接建立。
TCP四次挥手
- 客户端发送
FIN
报文。 - 服务器回复
ACK
报文。 - 服务器发送
FIN
报文。 - 客户端回复
ACK
报文,连接关闭。
TCP网络编程
客户端步骤
- 创建
Socket
对象,连接服务器。 - 获取输入/输出流,进行数据传输。
- 关闭
Socket
。
java
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream out = socket.getOutputStream();
out.write("Hello".getBytes());
socket.close();
服务器步骤
- 创建
ServerSocket
对象,监听端口。 - 调用
accept()
方法,等待客户端连接。 - 获取输入/输出流,进行数据传输。
- 关闭
ServerSocket
。
java
ServerSocket server = new ServerSocket(8888);
Socket socket = server.accept();
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data, 0, len));
server.close();
UDP网络编程
UDP特点
- 无连接:发送数据前不需要建立连接。
- 不可靠:不保证数据一定到达。
发送端
java
DatagramSocket ds = new DatagramSocket();
byte[] data = "Hello".getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 10000);
ds.send(dp);
ds.close();
接收端
java
DatagramSocket ds = new DatagramSocket(10000);
byte[] buffer = new byte[1024];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
ds.receive(dp);
System.out.println(new String(dp.getData(), 0, dp.getLength()));
ds.close();
URL编程
URL类
- 功能:表示网络资源的地址。
- 结构 :
协议://主机名:端口号/路径?参数
。
java
URL url = new URL("http://www.atguigu.com/index.html");
System.out.println(url.getProtocol()); // 输出协议
System.out.println(url.getHost()); // 输出主机名
URLConnection类
- 功能:与URL建立连接,进行数据读写。
java
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data, 0, len));
小结
- IP和端口号:定位网络中的主机和应用程序。
- TCP:可靠传输,适合大数据量。
- UDP:快速传输,适合实时应用。
- URL:表示网络资源地址,支持HTTP协议。
网络编程 IP和端口号 网络协议 TCP UDP URL编程