17.4.3 使用MulticastSocket实现多点广播(3)

上面程序中init()方法里的第一行粗体字代码先创建了一个MulticastSocket对象,由于需要使用该对象接收数据报,所以为该Socket对象设置使用固定端口;第二行粗体字代码将该Socket对象添加到指定的多点广播IP地址;第三行粗体字代码设置该Socket发送的数据报会被回送到自身(即该Socket可以接收到自己发送的数据报)。至于程序中使用MulticastSocket发送、接收数据报的代码,与使用DatagramSocket并没有区别,故此处不再赘述。

下面将结合MulticastSocket和DatagramSocket开发一个简单的局域网即时通信工具,局域网内每个用户启动该工具后,就可以看到该局域网内所有的在线用户,该用户也会被其他用户看到,即看到如图17.9所示的窗口。

在图17.9所示的用户列表中双击任意一个用户,即可启动一个如图17.10所示的交谈窗口。

如果双击图17.10所示用户列表窗口中的"所有人"列表项,即可启动一个与图17.10相似的交谈窗口,不同的是通过该窗口发送的消息将会被所有人看到。

图17.9  局域网聊天工具
图17.10  与特定用户交谈

该程序的实现思路是,每个用户都启动两个Socket,即一个MulticastSocket,一个DatagramSocket。其中MulticastSocket会周期性地向230.0.0.1发送在线信息,且所有用户的MulticastSocket都会加入到230.0.0.1这个多点广播IP地址中,这样每个用户都可以收到其他用户广播的在线信息,如果系统经过一段时间没有收到某个用户广播的在线信息,则从用户列表中删除该用户。除此之外,该MulticastSocket还用于向所有用户发送广播信息。

DatagramSocket主要用于发送私聊信息,当用户收到其他用户广播来的DatagramPacket时,即可获取该用户MulticastSocket对应的SocketAddress,这个SocketAddress将作为发送私聊信息的重要依据--本程序让MulticastSocket在30000端口监听,而DatagramSocket在30001端口监听,这样程序就可以根据其他用户广播来的DatagramPacket得到他的DatagramSocket所在的地址。

本系统提供了一个UserInfo类,该类封装了用户名、图标、对应的SocketAddress以及该用户对应的交谈窗口、失去联系的次数等信息。该类的代码片段如下。

程序清单:codes\17\17.4\LanTalk\UserInfo.java

  1. public class UserInfo
  2. {
  3. // 该用户的图标
  4. private String icon;
  5. // 该用户的名字
  6. private String name;
  7. // 该用户的MulitcastSocket所在的IP地址和端口
  8. private SocketAddress address;
  9. // 该用户失去联系的次数
  10. private int lost;
  11. // 该用户对应的交谈窗口
  12. private ChatFrame chatFrame;
  13. public UserInfo(){}
  14. // 有参数的构造器
  15. public UserInfo(String icon , String name
  16. , SocketAddress address , int lost)
  17. {
  18. this.icon = icon;
  19. this.name = name;
  20. this.address = address;
  21. this.lost = lost;
  22. }
  23. // 省略所有field的setter和getter方法
  24. ...
  25. // 使用address作为该用户的标识,所以根据address
  26. // 重写hashCode()和equals()方法
  27. public int hashCode()
  28. {
  29. return address.hashCode();
  30. }
  31. public boolean equals(Object obj)
  32. {
  33. if (obj != null && obj.getClass() == UserInfo.class)
  34. {
  35. UserInfo target = (UserInfo)obj;
  36. if (address != null)
  37. {
  38. return address.equals(target.getAddress());
  39. }
  40. }
  41. return false;
  42. }
  43. }
时间: 2024-10-13 21:35:39

17.4.3 使用MulticastSocket实现多点广播(3)的相关文章

17.4.3 使用MulticastSocket实现多点广播(2)

// 让该类实现Runnable接口,该类的实例可作为线程的target public class MulticastSocketTest implements Runnable { // 使用常量作为本程序的多点广播IP地址 private static final String BROADCAST_IP = "230.0.0.1"; // 使用常量作为本程序的多点广播目的地端口 public static final int BROADCAST_PORT = 30000; // 定

使用MulticastSocket实现多点广播

原文链接:http://hbiao68.iteye.com/blog/1943354 DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送到多个客户端 若要使用多点广播,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有所有主机都能收到该数据报.IP多点广播(或多点发送)实现了将单一信息发送到多个接受者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,当客户端需要发送.接

疯狂Java讲义(第4版) PDF 电子书 百度云 网盘下载

java电子书推荐理由:1)作者提供用于学习和交流的配套网站及作者亲自在线的答疑微信群.QQ群. 2)DVD光盘中含 1500分钟图书部分内容的相关视频 图书配套代码 Java面试题真题 PPT课件 设计模式电子书 有助于完成课后练习的大量完整案例 3)<疯狂Java讲义>历时十年沉淀,现已升级到第4版,经过无数Java学习者的反复验证,被包括北京大学在内的大量985.211高校的优秀教师引荐为参考资料.选作教材. 4)<疯狂Java讲义>曾翻译为中文繁体字版,在宝岛台湾上市发行.

【16-网络编程】

网络编程 网络的优势  •所谓计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息.共享硬件.软件.数据信息等资源. •计算机网络是现代通信技术与计算机技术相结合的产物,计算机网络可以提供以下一些主要功能. –资源共享. –信息传输与集中处理. –均衡负荷与分布处理. –综合信息服务.  按规模的三种分类 •局域网(LAN):指在一个较小地理范围内的各种计算机网络设备互连在一起的通信网络,可以包含一个或

Java 多客户端版 2048 源码

byte包 Calss Byte 1 package Byte; 2 import java.io.*; 3 public class Byte implements Serializable{ 4 public static byte[] int2Byte(int []intValue){ 5 int length=intValue.length; 6 byte[] b=new byte[length*4]; 7 for(int i=0;i<length;i++){ 8 for(int j=0

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 ******************1.4 通讯协议 9 **************2.Java网络相关类 10 ******************2.1 URLDe

Java笔记(9)-网络编程

不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑葚:也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了. 鲁迅 -–<从百草味到三味书屋> ---- [TOC] Java网络编程 URL 类 URL统一资源定位符 一个URL对象通常包含最基本的3部分信息:协议,地址,资源. 示例 用字节流读取流输入流中的数据时,由于汉字是两个字节,如果读取的长度不合适,就会有乱码,可以指定编码格式解决,增加一次读取的数据也可以解决, 用字符流也可以 中文乱码问

Java网络编程 探险

我们先来看看计算机网络主要功能:资源共享:信息传输和集中处理:负载均衡和分布处理:综合信息服务. 实际上Java的网络编程就是服务器通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信了. 1.认识网络编程 计算机网络中实现通信的约定被称为通信协议,通信协议负责对传输速率.传输代码.代码结构.传输控制步骤.出错控制等制定处理标准. 计算机网络的OSI模型(各种计算机网络的参考标准)如下: 1)上层协议 http,ftp,https 2)

Android MulticastSocket IP组播

MulticastSocket是对等的关系,也就是他们通过IP多点组播保留的地址来相互接收在这个组的Socket发送的消息 我写了一个例子,MultiSocketB是一个service,用于先接收再发送,MultiSocketA用于先发送再接收,完成这一动作后退出 记得要加使用网络的权限 <uses-permission android:name="android.permission.INTERNET" /> 先看MultiSocketA <?xml version