JAVA 网络编程 - 实现 群聊 程序
在实现 这个 程序之前, 我们 需要 了解 一些 关于 Java 网络 编程 的 知识.
基本 的 网络知识:
网络模型
OSI (Open System Interconnection 开放系统互连) 参考模型.
TCP/IP 参考模型.
网络通讯要素
IP 地址
端口号
传输协议
*** 网络编程 指的就是 网络技术 和 IO 技术的综合.
网络参考模型.
OSI 参考模型 TCP/IP
应用层---------------------
表示层 应用层
会话层---------------------
传输层 传输层
网络层 网际层
数据链路层-----------------
主机 至 网络层
物理层--------------------
网络 7 层
*** ipconfig/all 物理地址. . . . . . . . . . . . . : 54-3H-4L-7P-44-JK , 这个地址 是全球 唯一的. (这个 是 网卡的标识号)
IP 地址: InetAddress
网络中 设备的标识. 例如: 192.168.1.23 (这个网段 通常用于 局域网) 最大 为 255
不易记忆, 可用主机名(更易于记忆) 例如: 我的 主机名 FDSJLAKJFL 和 IP 地址对应, 也是 唯一的.
每一台计算机中 都有网卡(MAC)地址, 这个地址 默认 绑定的 一个 IP 地址, 默认就是 127.0.0.1 (如果 访问的 主机是自己的 话, 就可以用 这个 地址来访问.)
本地 回环地址: 127.0.0.1 主机名: localhost
端口
用于标识 进程的 逻辑地址, 不同进程的标识.
有效端口: 0!65535, 其中 0 ~ 1024 是 系统使用 或 保留端口.
*** 传输协议
通讯的规则
常见协议: TCP, UDP
// *** 检测 网卡是否正常工作.
C:\Users>ping 127.0.0.1
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
如果 不是以上结果, 而是 失败了话, 就很有可能 是 网卡 出了问题.
// *** 可用于 访问 的网站 有很多 游戏广告, 可以将 这些 游戏广告的 域名 写到 hosts 文件中来. 就打不开 哪些 广告 网站, 只会 打开自己 设置的 hosts 文件 中的 IP 地址 所对应的 .
*** 配置 hosts 文件. 127.0.0.1 www.game.com.cn
本机中 没有此资源, 表示 该页面 无法显示.
序列号, 将 校验的 网站的 IP 地址 改为 自己 电脑的 IP 地址, 自己电脑中 是没有 这个 校验 程序的, 所以 就 哦了. 软件 每次 联网 校验 都没用, 所以就可以免费使用了.
不过 首先要知道 校验的网站的 域名是什么.(360 地址列表)
端口
*** 在计算机中, 就 0 ~ 65535 六万 多个 端口 是可以用的, 而 0 ~ 1024 这些端口 尽量不要用, 这些 端口 很多 都 对应着 Windows 系统中的 应用程序,
*** 你要用了 , Windows 就用不了了. 数字标识 得 具有唯一性, 不能 两个 程序 用一个 端口.
关于 TCP, UDP, Socket, IO 流的 了解 和 使用:
TCP/UDP
UDP (数据报文包协议)
将 数据及 源 和 目的 封装成 数据包中, 不需要建立连接. 面向 无连接.
每个 数据包的 大小 限制在 64k 内.
因 无连接, 是 不可靠协议 不管对方在不在, (没 连接上 也行), 打个包(64k 内), 放个地址,就送.
不需要建立连接, 速度快. : 好处
TCP (传输控制协议)
建立连接, 形成传输数据的通道. 保证对方在,(建立连接)
在连接中 进行大数据量 传输.
通过 三次 握手 完成 连接, 是 可靠协议. 你在吗? 我在. 我知道了. 三次握手.
必须建立 连接, 效率 会 稍低.
例如: TCP 就 相当于 打电话. UDP 就相当于 对讲机.
Socket
Socket 就是为 网络服务提供的一种 机制.
通信的 两端都有 Socket.
网络通信 其实就是 Socket 间的通信.
数据在 两个 Socket 间通过 IO 传输.
TCP 用的 是 客户端 和 服务端 进行通讯的.
UDP 分的是 发送 和 接收.
TCP 分的是 客户端 和 服务端.
关于 局域网 中的 广播地址:
255 广播 地址, 我发一句, 到 广播地址, 广播 地址 发给 这个 网段中 所有的 主机, 你看到,我也会看到, 就实现了 聊天 功能,只要我们在 同一个 局域网中.就哦了.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPChatTest { public static void main(String[] args) throws IOException{ /*
*
* 案例一: 通过 UDP 实现 群聊程序.
*
* 思路:
*
* 这个程序中 既有 收 又有 发 , 那么 需要同时 执行, 需要使用 多线程 技术.
*
* 一个线程 负责发, 一个 线程 负责收, 需要两个任务.(线程任务);
*
* */ // 发送端 的Socket , 接收端 的 Socket; DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10000); // 创建 任务 对象. Send send = new Send(sendSocket); Rece rece = new Rece(receSocket); // *** 创建 线程 并开启. Thread t1 = new Thread(send); // *** 发 Thread t2 = new Thread(rece); // *** 收 t1.start(); t2.start(); }
} /*
*
*
* 255 广播 地址, 我发一句, 到 广播地址, 广播 地址 发给 这个 网段中 所有的 主机, 你看到,我也会看到, 就实现了 聊天 功能,只要我们在 同一个 局域网中.就哦了.
*
*
* */
// 发送任务 这里 先把 架子 搭起来 , 都需要 哪些 东西. class Send implements Runnable{ private DatagramSocket ds; public Send(DatagramSocket ds) { this.ds = ds; } @Override
public void run() { // System.out.println("UDP2 发送端 run "); // *** 这里写的端口号 如果 已经 有 程序在使用了, 就不能用 这个 端口号了, 程序会启动不起来, 因为 端口号 冲突了.(会 发生 地址 已被 占用 异常.)
// *** 数据来自于 键盘录入. try { BufferedReader bufin = new BufferedReader(new InputStreamReader(System.in)); // *** 键盘 录入 也是 阻塞式的, 你没录入 就不会 停止, 一直 阻塞在 这里.
String line = null;
while((line = bufin.readLine()) != null) { byte[] buf= line.getBytes(); // *** 将数据 转成 数组. DatagramPacket dp = new DatagramPacket( buf,buf.length,InetAddress.getByName("192.168.1.255"),10000);
// *** 这里的 地址 可以写成 其他人的 IP 地址 和 端口号 ,就可以 进行 聊天了.
ds.send(dp); // *** 既然是 键盘 录入, 那么 就一定要 加一个 结束 标记. if("886".equals(line)) { break; } } // *** 关闭 资源
ds.close();
} catch (IOException e) { } } } // 接收任务.
class Rece implements Runnable{ private DatagramSocket ds; public Rece(DatagramSocket ds) { this.ds = ds;
}
@Override
public void run() {
// System.out.println("udp2 接收端 run "); while(true) { try { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); // *** 阻塞, 如果 没有接收到 数据 就会 一直阻塞在这里. String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(),0,dp.getLength()); System.out.println(ip + ":" + port+ ":" + text); if(text.equals("886")) { System.out.println(ip + "...离开 聊天室" ); }
}catch(IOException e) {
} // ds.close(); *** 一直在 接收, 收 别人 发过来的 数据, 我就不用 关闭 资源了. } } }
这个 程序 使用的 环境 是 在一个 局域网中, 只要 启动 这个 程序, 发的 消息 会通过 255 这个 广播 地址 发送到 在这个 网段内的 主机中, 那么 大家 就都可以 看见, 就可以 实现 聊天 功能, 当然 ,
IP 地址 也可以使用 你自己的 主机 IP 地址, 只是 你自己 的 IP 地址 是不具备 广播的 功能的, 别人 还是 可以 发送给 你信息, 你肯定 可以 看到, 但是 别人 那里 只是 显示 发出了 消息, 不会 显示 回复的 消息, 因为 我写的程序 发送的 IP 地址 不是 给他的.
感谢 毕
JAVA 网络编程 - 实现 群聊 程序的更多相关文章
- 基于JAVA网络编程的聊天小程序
package com.neusoft.edu.socket; import java.io.BufferedReader; import java.io.IOException; import ja ...
- Java网络编程(UDP协议-聊天程序)
接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- 20145215实验五 Java网络编程及安全
20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...
- [未完成]关于Java网络编程总结
网络的七层结构: 第一层:物理层,网线. 第二层: 数据链路层,交换机.交换机有IP地址.这一层的数据叫做帧 第三层:网络层,数据包方向的定义,路由器.现在也有具有路由功能的交换机.主要将从下层接收到 ...
- Java 网络编程---分布式文件协同编辑器设计与实现
目录: 第一部分:Java网络编程知识 (一)简单的Http请求 一般浏览网页时,使用的时Ip地址,而IP(Internet Protocol,互联网协议)目前主要是IPv4和IPv6. IP地址是一 ...
- Tinychatserver: 一个简易的命令行群聊程序
这是学习网络编程后写的一个练手的小程序,可以帮助复习socket,I/O复用,非阻塞I/O等知识点. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. 功能 编写一个简 ...
- Java网络编程和NIO详解6:Linux epoll实现原理详解
Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
随机推荐
- 如何获取Html的height和width属性(网页宽、高)
1.页面如图所示 2.Html代码 <div style="color:green;" id="html_info"></div> 3. ...
- Vue+Vuex初体验
首先: 安装vuex npm install vuex -S 需要有两个组件(HelloWord.vue 和 HelloDemo.vue)[组件自定义] 注册路由 注册store 测试 一.需要有两个 ...
- github二级域名配置
首先打开GitHub并登上你的GitHub账号 新建仓库 点击settings 接下来就是操作git往这个仓库存文件,该域名会访问index.html文件
- swoole是多进程还是多线程
由于PHP语言不支持多线程,因此Swoole使用多进程模式.在多进程模式下存在进程内存隔离,在工作进程内修改global全局变量和超全局变量时,在其他进程是无效的. 进程隔离 $fds 虽然是全局变量 ...
- 前端小白webpack学习(一)
俗话说得好,好记性不如烂笔头. 之前就在学习中看过webpack的教程,然而一段时间没用,火速的忘光了.写这篇博文,做个总结,也让自己以后有个地方回顾. 看webpack之前,我先去看了一下官方文档, ...
- 【docker构建】基于docker搭建redis数据库缓存服务
搭建redis服务 首先拉取镜像==>运行镜像为容器 # 先搜索下redis镜像 [root@VM_0_10_centos wordpress]# docker search redis # 拉 ...
- Java题库——Chapter4 循环
1)How many times will the following code print "Welcome to Java"? int count = 0; while (co ...
- java 超详细面经整理(持续更新)2019.12.18
目录 Java SE 请你谈谈Java中是如何支持正则表达式操作的? 请你简单描述一下正则表达式及其用途. 请你比较一下Java和JavaSciprt? 在Java中如何跳出当前的多重嵌套循环? 讲讲 ...
- canvas绘制星星和月亮
用变量的方式绘制一个五角星,首先求五角星十个顶点的坐标. 可以把每个五角星看成外顶点用一个大圆绘制,内顶点用小圆绘制.在坐标系(0deg)下,根据每个顶点的角度和圆的半径求得x,y. 而每个大顶点相差 ...
- JavaScript中的this绑定丢失及解决方法
经常犯的错误:混淆了this绑定规则. 代码如下: var obj = { id: 'vexekefo', cool() { console.log(this.id); } }; var id = ' ...