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
- public class UserInfo
- {
- // 该用户的图标
- private String icon;
- // 该用户的名字
- private String name;
- // 该用户的MulitcastSocket所在的IP地址和端口
- private SocketAddress address;
- // 该用户失去联系的次数
- private int lost;
- // 该用户对应的交谈窗口
- private ChatFrame chatFrame;
- public UserInfo(){}
- // 有参数的构造器
- public UserInfo(String icon , String name
- , SocketAddress address , int lost)
- {
- this.icon = icon;
- this.name = name;
- this.address = address;
- this.lost = lost;
- }
- // 省略所有field的setter和getter方法
- ...
- // 使用address作为该用户的标识,所以根据address
- // 重写hashCode()和equals()方法
- public int hashCode()
- {
- return address.hashCode();
- }
- public boolean equals(Object obj)
- {
- if (obj != null && obj.getClass() == UserInfo.class)
- {
- UserInfo target = (UserInfo)obj;
- if (address != null)
- {
- return address.equals(target.getAddress());
- }
- }
- return false;
- }
- }
17.4.3 使用MulticastSocket实现多点广播(3)的更多相关文章
- 17.4.3 使用MulticastSocket实现多点广播(4)
17.4.3 使用MulticastSocket实现多点广播(4) 通过UserInfo类的封装,所有客户端只需要维护该UserInfo类的列表,程序就可以实现广播.发送私聊信息等功能.本程序底层通 ...
- 17.4.3 使用MulticastSocket实现多点广播(1)
http://book.51cto.com/art/201203/322560.htm <疯狂Java讲义(第2版)>本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法 ...
- 17.4.3 使用MulticastSocket实现多点广播(2)
// 让该类实现Runnable接口,该类的实例可作为线程的target public class MulticastSocketTest implements Runnable { // 使用常量作 ...
- 17.4.3 使用MulticastSocket实现多点广播(5)
该类主要实现底层的网络通信功能,在该类中提供了一个broadCast()方法,该方法使用Multicast Socket将指定字符串广播到所有客户端:还提供了sendSingle()方法,该方法使用D ...
- 使用MulticastSocket实现多点广播
原文链接:http://hbiao68.iteye.com/blog/1943354 使用MulticastSocket实现多点广播 DatagramSocket只允许数据报发送给指定的目标地址,而M ...
- JAVA基础知识之网络编程——-使用MutilcastSocket实现多点广播
IP多点广播原理 设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看作一个组,当客户需要发送和接受信息时,加入到该组即可. IP协议为多点广播提供了一批特殊的IP地址,范围是224.0.0 ...
- java之DatagramSocket、DatagramPackage丶MulticastSocket 广播学习
1.基本概念: a.DatagramPacket与DatagramSocket位于java.net包中 b.DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送 ...
- Android设备一对多录屏直播--(UDP组播连接,Tcp传输)
原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...
- Android开发之无线遥控器
最近弄了一个UDP/TCP的小东西,主要需要实现的功能如下(服务器端): 1.基于局域网 2.服务器端网络接口为无线与有线 3.服务器端接收到客户端的数据需要模拟按键进行处理 4.开机自启动 5.使用 ...
随机推荐
- Redis如何保存数组和对象
个人建议使用PHP自带的序列化函数serialize和unserialize函数 我们可以封装一个自己的Redis类 <?php class MyRedis{ private static $h ...
- launchMode传递参数注意startActivityForResult
Activity1 到Activity2 用startActivityForResult 如果Activity2的launchMode为 singleInstance 和 singleTask 都会启 ...
- Windsock套接字I/O模型学习 --- 第二章
1. select模型 select模型主要借助于apiselect来实现,所以先介绍一下select函数 int select( int nfds, // 忽略,仅是为了与 Berkeley 套接字 ...
- HDU 1072/BFS
题目链接 Nightmare Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 
项目使用的是tomcat7 ,浏览器是ie11 突然打开浏览器发现不能获取数据了 tomcat conf server.xml 文件 <Connector port="8080&quo ...
- 在CDockablePane中嵌入CFormView
CDockablePane中嵌入CFormView与嵌入CDialogEx稍有不同,差异主要体现在CFormView类本身与CDialogEx类的不同上,CDockablePane层面的操作完全相同. ...
- 网络获取的XML的Pull解析
<?xml version="1.0" encoding="utf-8" ?> - <students> - <student x ...
- Android中自定义veiw使用Java中的回调方法
//------------------MainActivity----中---------------------------------- import android.os.Bundle;imp ...
- HDU 1686 Oulipo(KMP+计算匹配成功次数)
一开始总是超时,后来发现还是方法没找对,这个跟普通KMP不太一样的就是,KMP匹配成功的时候会完全跳过已经匹配成功的匹配段,至少我掌握的是.那么如何避免这样的问题呢,举个栗子啊 原串为ABABA,模式 ...
- android 界面悬浮框实现
// 定义浮动窗口布局 private View mFloatLayout; // 定义浮动窗口布局对象 private WindowManager.LayoutParams wmParams; // ...