网络编程:编写程序,让不同的计算机之间能通过网络之间实现数据交换和通信。
通信的架构:c/s架构(客户端/服务器)高度中心化 服务器是核心 24h运行 客户端可以是app
b/s架构(浏览器/服务器)高度中心化 相当于客户端都变成了浏览器 eg 淘宝网页版
p2p架构(点对点)去中心化 每台电脑既是客户端也是服务器
三个核心要素:1.ip地址 2.端口号 3.协议
ip地址:能确定网络上某台计算机的唯一地址
端口号:端口决定数据传给谁 端口号的取值范围 0 - 65535 知名端口 0 - 1023
协议:通信的规则 tcp和udp协议 tcp可以实现可靠传输 udp则是实现快速传输
网络编程主要靠 Socket (套接字)实现
osi七层网络结构:
1.物理层 实现物理信号(0和1的电信号、光信号的传输)
2.数据链路层 局域网传输 通过mac地址在相邻节点传帧
3.网络层 寻址和路由 决定数据走哪条路能走到对方的ip
4.传输层 实现端到端传输 确保数据完整到达 利用 tcp协议和udp协议
5.会话层 管理连接 负责建立、维持、断开通信会话
6.表示层 翻译数据 负责加密、解密、格式转换
7.应用层 产生数据 即你用的软件界面 往往利用 http ftp smtp协议
在五层结构中 前四层与七层相同 只有最后的一层把七层的后三层合并成为一个应用层
I/O模型:解决的是程序如何与操作系统合作来收发数据的问题
1.阻塞I/O(BIO) 特点:程序发起读取请求后,会被一直阻塞,直到数据完全准备好再返回。一个线程只能处理一个连接。
2.非阻塞I/O(NIO) 特点:程序发起一个请求,如果数据没好,系统会立刻返回一个EAGAIN,程序会不断轮询查看数据好了没。线程不会阻塞住但是频繁询问会消耗cpu
3.I/O多路复用 特点:一个线程可以同时监视成千上万个连接 是现代高并发网络服务器的核心基石。
4.信号驱动I/O 特点:利用信号机制,在内核数据准备好时通知程序。
5.异步I/O(AIO) 特点:程序发出请求后完全不管,操作系统负责等数据和拷贝数据,完成后再通知程序
初步实现BIO 网络编程 代码如下:
public class MServer {
public void startServer() throws IOException {
ServerSocket server = new ServerSocket(9999);
System.out.println("服务器已经启动,等待连接中...");
Socket socket = server.accept();
// 使用 OutputStreamWriter 包装,并指定 "GBK"
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream(), "GBK");
PrintWriter out = new PrintWriter(osw, true);
out.println("登录成功");
System.out.println("已向客户端发送:登录成功");
// 注意:如果你在 Telnet 里输入中文发给服务器,这里也需要改成 "GBK"
//InputStreamReader:它是一个“翻译官”,负责把二进制的字节按照指定的编码(如 UTF-8)组合并翻译成字符。
//BufferedReader:它在翻译官的基础上加了一个“桶”(缓冲区)。它不会立刻把读到的字符给你,而是先把它们存起来。
InputStreamReader isr = new InputStreamReader(socket.getInputStream(), "GBK");
BufferedReader in = new BufferedReader(isr);
System.out.println("等待客户端发送消息...");
String line;
while((line = in.readLine()) != null){
System.out.println("Client 发来: " + line);
}
}
public static void main(String[] args) throws IOException {
new MServer().startServer();
}
}