网络编程
一. 网络常识
1. 什么是计算机网络
分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统。计算机网络, 可以很方便的进行 信息的传递, 资源的共享 。
2. 什么是计算机的IP地址
IP地址 是计算机在互联网中的唯一标识,就像人在社会中的身份证号码。
本机IP:
127.0.0.1
localhost
3. 什么是网络中网站的域名
域名可以简单的理解为IP地址的别名,更方便记忆,当输入域名后(例如www.baidu.com),计算机会访问域名解析商,然后得到ip地址,再进行访问。
4. 什么是计算机的端口号
(1)端口号的范围 0-65535 之间。
(2)与ip地址很相似,IP地址是计算机在网络中的唯一标识。端口号是计算机中 程序的标识,用于在一台计算机中区分不同的应用程序。
(3)端口号在使用时,应尽量避免0-1024之间的端口号,因为已经被一些知名的软件和windows操作系统所占用了。
5. 什么是计算机之间的通信协议
是计算机与计算机之间交流的标准;是对数据的传输速率,传入接口,步骤控制出错控制等等制定的一套标准。
常用的通信协议:
(1)http协议:超文本传输协议。80端口号
(2)https协议:安全的超文本传输协议。443端口号
(3)ftp协议:文件传输协议。21端口号
(4)TCP协议:传输控制协议
(5)UDP协议:数据报协议
二. 网络编程程序的分类
1. B/S 程序:浏览器与服务器程序。
2. C/S 程序:客户端与服务器程序。
三. TCP协议 - OSI网络模型
指的是 从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程。
七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层
四. 三次握手
tcp协议客户端与服务器连接时,存在三次握手操作,确保消息能准确无误的发送。
三次握手:
第一次握手,客户端向服务器发出连接请求,等待服务器确认
第二次握手,服务器向客户端发送一个响应,通知客户端收到了连接请求。
第三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。
由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛
断开连接时 , 存在四次挥手操作。
五. TCP协议的C/S程序
需要使用到两个类,来编写TCP协议的CS程序。
1. ServerSocket 搭建服务器
2. Socket 搭建客户端
两方使用socket(套接字,通信端点) 进行交流
六. ServerSocket
用于创建服务器。创建完毕后,会绑定一个端口号。然后此服务器可以等待客户端连接。每连接一个客户端,服务器就会得到一个新的Socket对象,用于跟客户端进行通信。
1. 常用构造方法:
ServerSocket(int port);
创建一个基于TCP/IP协议的服务器,并绑定指定的端口号。
注意: 参数port的范围是: 0-65535(建议1025-65535)
2. 常用方法:
Socket accept();
等待客户端连接,此方法会导致线程的阻塞,直到一个新的客户端连接成功,return Socket对象后,线程再继续执行。
void close();
释放占用的端口号,关闭服务器。
七. Socket
是两台计算机之间通信的端点,是网络驱动提供给应用程序编程的一种接口 一套标准,一种机制。
1. 构造方法:
Socket(String ip,int port)
创建一个套接字,并连接指定ip和端口号的服务器。
参数1. 服务器的ip地址
参数2. 服务器软件的端口号
2. 常用方法:
OutputStream getOutputStream();
返回的是指向通信的另一端点的输出流
InputStream getInputStream();
返回的是指向通信的另一端点的输入流
void close();
关闭套接字
注意:
在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的。
客户端的输入流,输入的是服务器的输出流,输出的内容;客户端的输出流,输出到了服务器的输入流中。
所以 在使用时,需要注意以下一点规则:
客户端与服务器获取流的顺序必须是相反的
例如:客户端先得到了输入流,那服务器必须先获取输出流。
八. 案例
客户端:
//1. 连接服务器
Socket socket = new Socket("192.168.102.228",8888);
//2. 得到输出流
//2.1 得到输出流
OutputStream os = socket.getOutputStream();
//2.2 将输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
//3. 得到输入流
//3.1 得到输入流
InputStream is = socket.getInputStream();
//3.2 将字节输入流, 转换为字符输入流 , 并转换为逐行读取流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//4. 循环接收用户输入
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("请输入要发送给服务器的内容:");
String text1 = input.nextLine();
//5. 将用户输入的内容, 发送给服务器
ps.println(text1);
//6. 接收服务器回复的消息
String text2 = br.readLine();
System.out.println(text2);
if("886".equals(text1)) {
break;
}
}
服务器:
public static void main(String[] args) throws Exception {
//1. 启动服务器, 并侦听8888端口号
ServerSocket server = new ServerSocket(8888);
//2. 打印提示
System.out.println("服务器已启动 , 等待客户端连接中...");
//3. 等待客户端连接
Socket socket = server.accept();
System.out.println("一个客户端连接成功:"+socket.getInetAddress().toString());
//4. 获取输入流
//4.1 获取输入流
InputStream is = socket.getInputStream();
//4.2 将输入的字节流 ,转换为字符流
InputStreamReader isr = new InputStreamReader(is);
//4.3 将字符流, 转换为逐行读取流
BufferedReader br = new BufferedReader(isr);
//5. 获取输出流
//5.1 获取输出流
OutputStream os = socket.getOutputStream();
//5.2 将字节输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
while(true) {
//6. 循环读取一行行的数据 ,读取操作会导致线程的阻塞, 直到客户端真的发送了数据,
//服务器才能接到, 顺序继续执行下面的代码
String text = br.readLine();
//7. 将这个文字, 再打印给客户端
ps.println("服务器:"+text);
if("886".equals(text)) {
break;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?