在实现 这个 程序之前, 我们 需要 了解 一些 关于 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 广播 地址, 我发一句, 到 广播地址, 广播 地址 发给 这个 网段中 所有的 主机, 你看到,我也会看到, 就实现了 聊天 功能,只要我们在 同一个 局域网中.就哦了.

  

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetAddress;
  7.  
  8. public class UDPChatTest {
  9.  
  10. public static void main(String[] args) throws IOException{
  11.  
  12. /*
  13. *
  14. * 案例一: 通过 UDP 实现 群聊程序.
  15. *
  16. * 思路:
  17. *
  18. * 这个程序中 既有 收 又有 发 , 那么 需要同时 执行, 需要使用 多线程 技术.
  19. *
  20. * 一个线程 负责发, 一个 线程 负责收, 需要两个任务.(线程任务);
  21. *
  22. * */
  23.  
  24. // 发送端 的Socket , 接收端 的 Socket;
  25.  
  26. DatagramSocket sendSocket = new DatagramSocket();
  27. DatagramSocket receSocket = new DatagramSocket(10000);
  28.  
  29. // 创建 任务 对象.
  30.  
  31. Send send = new Send(sendSocket);
  32.  
  33. Rece rece = new Rece(receSocket);
  34.  
  35. // *** 创建 线程 并开启.
  36.  
  37. Thread t1 = new Thread(send); // *** 发
  38.  
  39. Thread t2 = new Thread(rece); // *** 收
  40.  
  41. t1.start();
  42.  
  43. t2.start();
  44.  
  45. }
  46. }
  47.  
  48. /*
  49. *
  50. *
  51. * 255 广播 地址, 我发一句, 到 广播地址, 广播 地址 发给 这个 网段中 所有的 主机, 你看到,我也会看到, 就实现了 聊天 功能,只要我们在 同一个 局域网中.就哦了.
  52. *
  53. *
  54. * */
  55. // 发送任务 这里 先把 架子 搭起来 , 都需要 哪些 东西.
  56.  
  57. class Send implements Runnable{
  58.  
  59. private DatagramSocket ds;
  60.  
  61. public Send(DatagramSocket ds) {
  62.  
  63. this.ds = ds;
  64.  
  65. }
  66.  
  67. @Override
  68. public void run() {
  69.  
  70. // System.out.println("UDP2 发送端 run ");
  71.  
  72. // *** 这里写的端口号 如果 已经 有 程序在使用了, 就不能用 这个 端口号了, 程序会启动不起来, 因为 端口号 冲突了.(会 发生 地址 已被 占用 异常.)
  73. // *** 数据来自于 键盘录入.
  74.  
  75. try {
  76.  
  77. BufferedReader bufin = new BufferedReader(new InputStreamReader(System.in)); // *** 键盘 录入 也是 阻塞式的, 你没录入 就不会 停止, 一直 阻塞在 这里.
  78. String line = null;
  79. while((line = bufin.readLine()) != null) {
  80.  
  81. byte[] buf= line.getBytes(); // *** 将数据 转成 数组.
  82.  
  83. DatagramPacket dp = new DatagramPacket( buf,buf.length,InetAddress.getByName("192.168.1.255"),10000);
  84. // *** 这里的 地址 可以写成 其他人的 IP 地址 和 端口号 ,就可以 进行 聊天了.
  85. ds.send(dp);
  86.  
  87. // *** 既然是 键盘 录入, 那么 就一定要 加一个 结束 标记.
  88.  
  89. if("886".equals(line)) {
  90.  
  91. break;
  92.  
  93. }
  94.  
  95. }
  96.  
  97. // *** 关闭 资源
  98. ds.close();
  99. } catch (IOException e) {
  100.  
  101. }
  102.  
  103. }
  104.  
  105. }
  106.  
  107. // 接收任务.
  108. class Rece implements Runnable{
  109.  
  110. private DatagramSocket ds;
  111.  
  112. public Rece(DatagramSocket ds) {
  113.  
  114. this.ds = ds;
  115. }
  116. @Override
  117. public void run() {
  118. // System.out.println("udp2 接收端 run ");
  119.  
  120. while(true) {
  121.  
  122. try {
  123.  
  124. byte[] buf = new byte[1024];
  125.  
  126. DatagramPacket dp = new DatagramPacket(buf, buf.length);
  127.  
  128. ds.receive(dp); // *** 阻塞, 如果 没有接收到 数据 就会 一直阻塞在这里.
  129.  
  130. String ip = dp.getAddress().getHostAddress();
  131.  
  132. int port = dp.getPort();
  133.  
  134. String text = new String(dp.getData(),0,dp.getLength());
  135.  
  136. System.out.println(ip + ":" + port+ ":" + text);
  137.  
  138. if(text.equals("886")) {
  139.  
  140. System.out.println(ip + "...离开 聊天室" );
  141.  
  142. }
  143. }catch(IOException e) {
  144. }
  145.  
  146. // ds.close(); *** 一直在 接收, 收 别人 发过来的 数据, 我就不用 关闭 资源了.
  147.  
  148. }
  149.  
  150. }
  151.  
  152. }

  

  这个 程序 使用的 环境 是 在一个 局域网中,   只要 启动 这个 程序, 发的 消息 会通过 255 这个 广播 地址 发送到 在这个 网段内的 主机中,  那么 大家 就都可以 看见, 就可以 实现 聊天 功能,  当然 ,

  IP 地址 也可以使用 你自己的 主机 IP 地址, 只是 你自己 的 IP 地址 是不具备 广播的 功能的, 别人 还是 可以 发送给 你信息, 你肯定 可以 看到, 但是 别人 那里 只是 显示 发出了 消息, 不会 显示 回复的 消息, 因为 我写的程序 发送的 IP 地址 不是 给他的.

感谢 毕

JAVA 网络编程 - 实现 群聊 程序的更多相关文章

  1. 基于JAVA网络编程的聊天小程序

    package com.neusoft.edu.socket; import java.io.BufferedReader; import java.io.IOException; import ja ...

  2. Java网络编程(UDP协议-聊天程序)

    接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...

  3. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  4. 20145215实验五 Java网络编程及安全

    20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...

  5. [未完成]关于Java网络编程总结

    网络的七层结构: 第一层:物理层,网线. 第二层: 数据链路层,交换机.交换机有IP地址.这一层的数据叫做帧 第三层:网络层,数据包方向的定义,路由器.现在也有具有路由功能的交换机.主要将从下层接收到 ...

  6. Java 网络编程---分布式文件协同编辑器设计与实现

    目录: 第一部分:Java网络编程知识 (一)简单的Http请求 一般浏览网页时,使用的时Ip地址,而IP(Internet Protocol,互联网协议)目前主要是IPv4和IPv6. IP地址是一 ...

  7. Tinychatserver: 一个简易的命令行群聊程序

    这是学习网络编程后写的一个练手的小程序,可以帮助复习socket,I/O复用,非阻塞I/O等知识点. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. 功能 编写一个简 ...

  8. Java网络编程和NIO详解6:Linux epoll实现原理详解

    Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...

  9. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

随机推荐

  1. Cocos2d-x项目编译为Android应用——命令行方式

    配置: 相关工具:Cocos2d-x 3.2 + Ant 1.9.4 + Android NDK r9d + Android SDK 运行平台:OS X 10.9.4+ Xcode 6 前言:笔者使用 ...

  2. dp习题

    仅收录有意思的题目 数的划分 导弹拦截 : LIS的两种优化 教主的花园:将不同的情况分类,最后取max 午餐 & 挂饰: 需要排序 挂饰:0-1背包处理负数体积 投资的最大效益 : 完全背包 ...

  3. R学习

    R内容: R-1 基础 R-2 基础绘图 R-3 t分布--t置信区间--t检验 R-4 方差分析 R-5 相关分析-卡方分析 R-6 线性回归模型分析流程 R实战第7章 线性回归 逻辑回归 主成分分 ...

  4. Java之Arrays类

    Arrays概述 java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等.其所有方法均为静态方法,调用起来非常简单. 常用方法 public static String t ...

  5. ModuleNotFoundError: No module named 'xxx'; 'xxx' is not a package

    错误: ModuleNotFoundError: No module named 'xxx'; 'xxx' is not a package 通过pycharm对脚本进行debug时,出现了如下错: ...

  6. 浅谈Kotlin中的函数

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...

  7. PHP程序执行的过程原理

    为了以后能开发PHP扩展,就一定要了解PHP的执行顺序.这篇文章就是为C开发PHP扩展做铺垫. Web环境我们假设为Apache.在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个m ...

  8. RabbitMQ的高级特性概念理解

    1.RabbitMQ中的消息如何保障百分之百的投递成功? 答:百分之百的投递成功,方案可以参考下面的2.3. 2.什么是生产者端的可靠性投递? 答:第一步,生产者保障消息的成功发出.第二步,保障Rab ...

  9. 发布方式一:发布.netcore流程

    通过注册世纪互联,发布网站 注册需要上传身份证正反照片,以及打款一元,试用期一个月 https://www.azure.cn     注册完成后,进入主页面: 如图所示,创建完成后的效果: 点开详情, ...

  10. Android Gradle 学习笔记(四):Gradle 构建脚本

    本节我们从整体的角度来介绍一下Gradle. 一.setting.gradle 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认的名字就是setting.gradle, ...