通信服务前沿知识

网络编程:编写程序,让不同的计算机之间能通过网络之间实现数据交换和通信。

通信的架构: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();
    }
}
相关推荐
203号居民7 分钟前
LeetCode hot 100 —560. 和为 K 的子数组
java·算法·leetcode
浪客川25 分钟前
使用 IDEA 生成API文档
java·ide·intellij-idea
上下求索,莫负韶华1 小时前
笔记-数据库事务和java事务和切面
java·数据库·笔记
@小匠1 小时前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
Knight_AL1 小时前
Lombok @Builder 踩坑:build() 前后对象类型不一样
android·java·开发语言
SamChan902 小时前
PDF翻译中的并发控制:用Semaphore防止API限流与资源耗尽
java·jvm·pdf
大黄说说2 小时前
Java 与 Kotlin 混合开发避坑指南:老项目平滑迁移 Kotlin 实操手册
java·开发语言·kotlin
snow@li2 小时前
SpringBoot:AOP日志切面全景梳理/原理+流程+实战+避坑
java·开发语言·spring boot
ma_king3 小时前
Spring Boot 接入飞书自定义机器人
java·后端
2401_894915533 小时前
部署 GEO 优化源码常见报错排查:端口、伪静态、缓存问题解决
java·运维·服务器·后端·缓存·开源