博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
17.4.3 使用MulticastSocket实现多点广播(3)
阅读量:4968 次
发布时间:2019-06-12

本文共 1936 字,大约阅读时间需要 6 分钟。

上面程序中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. }

转载于:https://www.cnblogs.com/senior-engineer/p/4967163.html

你可能感兴趣的文章
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
SqlCel 和MySQL for Excel在批量处理数据上的优劣
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
调节心态的十种做法
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>
潜罪犯
查看>>
编写高质量代码--改善python程序的建议(六)
查看>>
windows xp 中的administrator帐户不在用户登录内怎么解决?
查看>>
[spfa] Jzoj P4722 跳楼机
查看>>
代码审计入门后审计技巧
查看>>
Linux-Rsync服务器/客户端搭建实战
查看>>
接口和抽象类有什么区别
查看>>
简单通过百度api自动获取定位-前端实现
查看>>
180117 我的宠物识别判断语句
查看>>
JavaScript修炼之道pdf
查看>>
自己动手构造编译系统++编译、汇编与链接pdf
查看>>
JAVA 中文件读写函数BufferedReader 和 BufferedWriter 的使用
查看>>
Codeforces Round #206 (Div. 2)
查看>>