# FreeChatRoom **Repository Path**: zhxs_code/free-chat-room ## Basic Information - **Project Name**: FreeChatRoom - **Description**: No description available - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-02-21 - **Last Updated**: 2022-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README author(作者): name: zxl ,email: 505264729@qq.com 网络打洞原理介绍: 两台计算机想要进行通信就必须相互知道对方的ip和端口,由于ipv4地址的稀缺,导致很多计算机都是内网之中。内网中的主机被多个路由器或交换机层层包围, 所以一般只允许内网中的主机向外网的主机进行通信,不允许外网的主机向内网中的主机进行通信(一个ip地址有多个子网和多个主机,再没有更多信息的情况下,无法确定外网的主机到底是与内网中的哪一台主机进行通信)。 常用采用解决方案: 1. 端口映射。 在路由器或网关处指定某个外部端口映射为内网的某一台主机,从外部网络发送到这个端口的数据全部转发到内网指定的主机。 2. 打洞: 2台分别在不同内网中的机器通过借助在公网的某一台服务器事先沟通确认这两台内网中的主机在公网上的地址,然后2台主机分别向对方在公网的地址发起连接,即可进行通信。 详细步骤: https://zhuanlan.zhihu.com/p/40816201 模块说明 : 1. fcr-server是中转站,负责用来转发打洞请求; 2. fcr-common是通用组件 3. fcr-client模拟客户端 环境组件: 系统:macos或linux 应用:maven、jdk8及以上、ssh(用来登录应用设置端口) 心跳包: 参考: https://zhuanlan.zhihu.com/p/77182846 心跳整体功能划分: 心跳存活检测(server端与client端都要执行,才能确认对端的存活)、心跳发送(client端)、心跳应答(server端); 一、心跳存活检测: client端: 1.心跳发送服务: 涉及的技术参数: 心跳的数据结构、发送的间隔时间 2.心跳应答解析服务 涉及的技术参数: 心跳应答的数据结构 server端: 1. 心跳存活检测服务: 2. 心跳应答发送服务: 3. 心跳解析服务: 使用指南: 主机启动( 本地编译可执行jar): 一、启动server端,监听指定端口接收的心跳包 1. 编译server端jar包 , 在项目根目录执行命令: mvn clean package -DskipTests 获得 fcr-server/target/fcr-server-0.0.1-SNAPSHOT.jar 这个可执行jar包; 1-1. 确保"jwt.jks"文件与 fcr-server-0.0.1-SNAPSHOT.jar 在同一个目录。 jwt.jks所在path: fcr-server/jwt.jks 2. 启动server , 执行命令: java -jar fcr-server-0.0.1-SNAPSHOT.jar 3. ssh登录server服务 (ssh设置为默认只支持本地,如果想远程登录请修改server源码中的监听host): 第一步: ssh -p 5000 root@localhost 第二部:输入密码 123 4. 输入要监听的端口号 ,在ssh登录成功后的命令行中输入以下命令: socket -l 端口号 出现类似 "listen ip: 10.108.132.235 , port:2000 success! " 的提示,则说明端口监听成功; 所有通过上面指定的端口接收的数据,都会打印在日志文件里: fcr-server.log 4-1. 如果想切换端口,需要先关闭之前的监听: socket -close 1 出现类似上面的"success"提示则说明关闭成功,然后再执行上面的第4步即可。 二、 启动client端,指定server的端口,发送心跳包,建立通信连接 1. 编译client的jar包,(如果已经编译过server端的jar包,则跳过此步) ,在根目录执行命令: mvn clean package 获得 fcr-client/target/fcr-client-0.0.1-SNAPSHOT.jar 这个可执行jar包; 1-1. 确保"jwt.jks"文件与 fcr-client-0.0.1-SNAPSHOT.jar 在同一个目录。 jwt.jks所在path: fcr-client/jwt.jks 2. 启动client端 ,执行命令: java -jar fcr-client-0.0.1-SNAPSHOT.jar 3. ssh登录client服务 (ssh设置为默认只支持本地,如果想远程登录请修改server源码中的监听host): 第一步: ssh -p 8000 root@localhost 第二部:输入密码 123 4. 指定server的ip和地址,使用以下命令: socket -server ip:port // ip地址与port之间用 ":"隔开 5. 指定client端发送通信数据的端口号: socket -l 要使用的端口号 ( 启动成功后,可以在控制台或日志中看到client与server端之间的心跳交互信息) docker方式启动服务: server端: 1. 进入 fcr-server 目录,执行以下命令: cd fcr-server 2. 执行自动编译脚本: sh ./server-start.sh client端: 1. 进入fcr-client目录: cd fcr-client 2. 执行自动编译脚本: sh ./client-start.sh fcr自带ssh支持的命令: // 进入fcr的shell控制台; 如果是server端,端口号是5000;如果是client端,端口号是8000 , 密码:123 ssh -p 端口号 root@localhost // 设置服务器端地址 socket -server 122.112.212.253:2000 // 本地监听一个端口号,使用tcp协议的通信可不执行 socket -l 端口号 // 设置远端地址 address的格式 < host:port > socket -r address // 发送聊天消息 , 如果使用udp协议,需要先监听一个端口号,会使用监听的端口发送消息到远端地址 socket -chat 消息内容 // 重置通信协议类型 协议类型支持:tcp、udp socket -protocol 协议类型