1.网络程序设计基础
网络程序设计基础涵盖了许多方面,包括网络协议、Web开发、数据库连接、安全性等。
1.1局域网与互联网
局域网(LAN)与互联网(Internet)是两个不同的概念,它们分别用于描述不同范围内的网络连接。
局域网(LAN):
定义: 局域网是指在一个相对较小的地理范围内连接在一起的计算机网络,如家庭、学校、办公室或公司。
范围: 通常,局域网覆盖的范围限制在一个建筑物或者一组相邻的建筑物内。
连接设备: 局域网内的设备可以通过局域网技术(如以太网、Wi-Fi等)相互通信,共享资源,比如打印机、文件等。
互联网(Internet):
定义: 互联网是一个全球性的计算机网络,它连接了世界上的数以亿计的设备,允许它们之间进行通信和数据交换。
范围: 互联网没有地理限制,覆盖全球范围。
连接设备: 互联网连接了各种设备,包括个人计算机、智能手机、服务器等。它是通过一系列的互联网服务提供商(ISP)相互连接起来的。
关系:
局域网是构建在较小的地理范围内,用于组织内部设备之间的通信。
互联网是一个覆盖全球的网络,将不同地理位置的局域网连接起来,使得全球范围内的设备能够相互通信。
通信方式:
局域网内部的通信通常更快、更可靠,而且通常不需要经过公共互联网。
互联网通信需要经过公共的基础设施,如因特网服务提供商(ISP),数据在全球范围内传输。
1.2网络协议
网络协议是计算机网络中设备之间进行通信和数据交换的规则和约定。它们定义了数据的格式、传输方法、错误检测等方面的规范,确保不同厂商和不同类型的设备能够在网络中互相通信。
1.IP协议
IP(Internet Protocol)是计算机网络中的一种基础协议,用于在网络中传输数据包。IP协议定义了数据包的格式和规则,确保数据在网络中正确传递。目前广泛使用的IP版本有两个:IPv4(Internet Protocol version 4)和IPv6(Internet Protocol version 6)。
IPv4(Internet Protocol version 4):
地址格式: IPv4地址是32位的,通常以点分十进制表示,如192.168.0.1。
地址空间: IPv4提供了大约42亿个唯一的地址,由于互联网的快速发展,IPv4地址空间已经不够用,导致IPv4地址枯竭问题。
子网: 为了更好地管理IP地址,IPv4引入了子网的概念,允许将一个大的IP地址块划分成多个小的子网。
私有地址范围: IPv4定义了一些私有地址范围,例如192.168.0.0/16,这些地址通常用于内部网络。
IPv6(Internet Protocol version 6):
地址格式: IPv6地址是128位的,通常以冒号分隔的十六进制表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
地址空间: IPv6提供了远远超过IPv4的地址空间,理论上足够支持未来互联网的发展需求。
简化报头: IPv6在报头中做了一些简化,减少了一些字段,提高了路由和转发效率。
无需NAT: 由于IPv6地址空间足够大,通常无需使用网络地址转换(NAT)技术,简化了网络配置和管理。
共同点:
数据包传输: IPv4和IPv6都是网络层协议,负责将数据包从源主机传输到目标主机。
逐跳路由: 在网络中,数据包通过一系列的路由器逐跳传输,最终到达目标主机。
由于IPv4地址枯竭的问题,全球范围内正在逐渐过渡到IPv6。IPv6提供了更大的地址空间,更好的路由和转发效率,以及更简化的网络配置。在实际应用中,IPv4和IPv6可能同时存在,而且网络设备和应用程序需要同时支持这两种协议,这被称为双栈(Dual Stack)支持。
2.TCP与UDP协议
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常见的传输层协议,它们定义了在计算机网络中数据如何被传输和接收的规则。以下是它们的主要特点和区别:
连接导向: TCP是面向连接的协议,建立了一条双向的通信路径,确保数据的可靠传输。
可靠性: TCP提供可靠的数据传输,通过使用确认机制和重传机制来确保数据的完整性和顺序性。
流控制: TCP通过流控制机制来控制数据的发送速率,防止接收方被过多的数据淹没。
拥塞控制: TCP使用拥塞控制算法,当网络拥塞时会调整发送速率,以避免网络的过载。
面向字节: TCP将数据视为一连串的字节流,而非独立的数据包。
UDP(User Datagram Protocol):
?
无连接: UDP是面向无连接的协议,通信双方在传输数据前不需要建立连接。
不可靠性: UDP不提供可靠的数据传输,不保证数据的完整性和顺序性,也不提供重传机制。
无流控制: UDP不提供流控制机制,因此发送方会一直以固定速率发送数据,而不会根据接收方的处理能力进行调整。
无拥塞控制: UDP不具备拥塞控制机制,因此在网络拥塞时可能会丢失数据包。
面向数据报: UDP将数据视为独立的数据包,而非字节流。
共同点:
端口: TCP和UDP都使用端口来标识应用程序,使得数据能够正确地交付到目标应用。
传输层协议: TCP和UDP都属于传输层协议,负责将数据从一个端点传输到另一个端点。
选择使用场景:
TCP适用于:
需要可靠数据传输的应用,如文件传输、电子邮件等。
需要确保数据按顺序到达的应用,如视频流、Web页面加载等。
UDP适用于:
实时性要求较高,能够容忍一定程度的数据丢失的应用,如实时语音、视频通话等。
需要较低的通信延迟,对数据可靠性要求不高的应用,如在线游戏。
3.端口与套接字
端口(Port)和套接字(Socket)是计算机网络中重要的概念,它们在网络通信中起到关键的作用。
客户端代码:
?
?
定义: 端口是一个逻辑上的概念,用于标识一台计算机中运行的特定应用程序或服务。它允许一台计算机上的不同应用程序通过网络进行通信,每个应用程序都被分配一个唯一的端口号。
范围: 端口号范围从0到65535,其中0到1023的端口号被称为「系统端口」或「知名端口」,它们通常用于一些常见的服务(如HTTP使用的80端口,FTP使用的21端口等)。1024到49151的端口号是「注册端口」,用于用户应用。49152到65535的端口号是「动态或私有端口」,它们用于动态分配,通常由客户端应用程序使用。
套接字(Socket):
定义: 套接字是支持网络通信的编程接口,它允许进程通过网络发送和接收数据。套接字由IP地址和端口号组成,标识了通信中的两个端点。套接字可以用于在同一台计算机上的进程间通信,也可以用于在不同计算机之间进行网络通信。
类型: 套接字可以分为两种类型:流套接字(Stream Socket)和数据报套接字(Datagram Socket)。
流套接字: 提供面向连接的、可靠的、基于字节流的通信,使用TCP协议。
数据报套接字: 提供无连接的、不可靠的、基于数据包的通信,使用UDP协议。
套接字编程通常包括创建套接字、绑定到一个特定的IP地址和端口号、监听连接请求(对于服务器端)、接受连接(对于服务器端)、连接到服务器(对于客户端)、发送和接收数据等步骤。
2.TCP程序
TCP(Transmission Control Protocol)是一种面向连接的、可靠的协议,常用于网络通信中。
2.1InetAddress类
InetAddress 类是 Java 中用于表示 IP 地址的类。它位于 java.net 包中,提供了一种在网络上标识主机的方法。InetAddress 类主要用于获取主机的 IP 地址和主机名。
3.UDP程序
UDP(User Datagram Protocol)是一种无连接、不可靠、简单的面向数据报的协议。UDP 提供了一种轻量级的数据传输机制,适用于一些对实时性要求较高、容忍数据丢失的应用场景。
3.1DatagramPacket类
DatagramPacket 类是 Java 中用于表示数据报包的类,通常用于 UDP 协议的通信。DatagramPacket 封装了数据和目标主机信息,包括目标主机的 IP 地址和端口号。这类被用于在网络上发送和接收数据报。
3:TCP Client:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
String serverAddress = "localhost";
int serverPort = 8080;
try (Socket socket = new Socket(serverAddress, serverPort)) {
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
String message = "Hello, server!";
outputStream.write(message.getBytes());
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String serverResponse = new String(buffer, 0, bytesRead);
System.out.println("Server response: " + serverResponse);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码:
?
?