知识大全 使用MulticastSocket实现多点广播(3)

Posted 字节

篇首语:万事须己运,他得非我贤。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用MulticastSocket实现多点广播(3)相关的知识,希望对你有一定的参考价值。

疯狂Java讲义:使用MulticastSocket实现多点广播(3)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  通过该UserInfo类的封装 这样所有客户端只需要维护该UserInfo类的列表 程序就可以实现广播 发送私聊信息等功能 本程序底层通信的工具类则需要一个MulticastSocket和一个DatagramSocket 该工具类的代码如下

  程序清单 codes/ / /LanTalk/ComUtil java

  //聊天交换信息的工具类

  public class ComUtil

  

  //使用常量作为本程序的多点广播IP地址

  private static final String BROADCAST_IP

  = ;

  //使用常量作为本程序的多点广播目的的端口

  //DatagramSocket所用的的端口为该端口

  public static final int BROADCAST_PORT = ;

  //定义每个数据报的最大大小为 K

  private static final int DATA_LEN = ;

  //定义本程序的MulticastSocket实例

  private MulticastSocket socket = null;

  //定义本程序私聊的Socket实例

  private DatagramSocket singleSocket = null;

  //定义广播的IP地址

  private InetAddress broadcastAddress = null;

  //定义接收网络数据的字节数组

  byte[] inBuff = new byte[DATA_LEN];

  //以指定字节数组创建准备接受数据的DatagramPacket对象

  private DatagramPacket inPacket =

  new DatagramPacket(inBuff inBuff length)

  //定义一个用于发送的DatagramPacket对象

  private DatagramPacket outPacket = null;

  //聊天的主界面

  private LanChat lanTalk;

  //构造器 初始化资源

  public ComUtil(LanChat lanTalk)throws IOException InterruptedException

  

  this lanTalk = lanTalk;

  //创建用于发送 接收数据的MulticastSocket对象

  //因为该MulticastSocket对象需要接收 所以有指定端口

  socket = new MulticastSocket(BROADCAST_PORT)

  //创建私聊用的DatagramSocket对象

  singleSocket = new DatagramSocket(BROADCAST_PORT + )

  broadcastAddress = InetAddress getByName(BROADCAST_IP)

  //将该socket加入指定的多点广播地址

  socket joinGroup(broadcastAddress)

  //设置本MulticastSocket发送的数据报被回送到自身

  socket setLoopbackMode(false)

  //初始化发送用的DatagramSocket 它包含一个长度为 的字节数组

  outPacket = new DatagramPacket(new byte[ ]

  broadcastAddress BROADCAST_PORT)

  //启动两个读取网络数据的线程

  new ReadBroad() start()

  Thread sleep( )

  new ReadSingle() start()

  

  //广播消息的工具方法

  public void broadCast(String msg)

  

  try

  

  //将msg字符串转换字节数组

  byte[] buff = msg getBytes()

  //设置发送用的DatagramPacket里的字节数据

  outPacket setData(buff)

  //发送数据报

  socket send(outPacket)

  

  //捕捉异常

  catch (IOException ex)

  

  ex printStackTrace()

  if (socket != null)

  

  //关闭该Socket对象

  socket close()

  

  JOptionPane showMessageDialog(null

   发送信息异常 请确认 端口空闲 且网络连接正常!

   网络异常 JOptionPane ERROR_MESSAGE)

  System exit( )

  

  

  //定义向单独用户发送消息的方法

  public void sendSingle(String msg SocketAddress dest)

  

  try

  

  //将msg字符串转换字节数组

  byte[] buff = msg getBytes()

  DatagramPacket packet = new DatagramPacket(

  buff buff length dest)

  singleSocket send(packet)

  

  //捕捉异常

  catch (IOException ex)

  

  ex printStackTrace()

  if (singleSocket != null)

  

  //关闭该Socket对象

  singleSocket close()

  

  JOptionPane showMessageDialog(null

   发送信息异常 请确认 端口空闲 且网络连接正常!

   网络异常 JOptionPane ERROR_MESSAGE)

  System exit( )

  

  

  //不断从DatagramSocket中读取数据的线程

  class ReadSingle extends Thread

  

  //定义接收网络数据的字节数组

  byte[] singleBuff = new byte[DATA_LEN];

  private DatagramPacket singlePacket =

  new DatagramPacket(singleBuff singleBuff length)

  public void run()

  

  while (true)

  

  try

  

  //读取Socket中的数据 读到的数据放在inPacket所封装的字节数组里

  singleSocket receive(singlePacket)

  //处理读到的信息

  lanTalk processMsg(singlePacket true)

  

  //捕捉异常

  catch (IOException ex)

  

  ex printStackTrace()

  if (singleSocket != null)

  

  //关闭该Socket对象

  singleSocket close()

  

  JOptionPane showMessageDialog(null

   接收信息异常 请确认 端口空闲 且网络连接正常!

   网络异常 JOptionPane ERROR_MESSAGE)

  System exit( )

  

  

  

  

  //持续读取MulticastSocket的线程

  class ReadBroad extends Thread

  

  public void run()

  

  while (true)

  

  try

  

  //读取Socket中的数据 读到的数据放在inPacket所封装的字节数组里

  socket receive(inPacket)

  //打印输出从socket中读取的内容

  String msg = new String(inBuff inPacket getLength())

  //读到的内容是在线信息

  if (msg startsWith(YeekuProtocol PRESENCE)

  && msg endsWith(YeekuProtocol PRESENCE))

  

  String userMsg = msg substring( msg length() )

  String[] userInfo = userMsg split(YeekuProtocol SPLITTER)

  UserInfo user = new UserInfo(userInfo[ ] userInfo[ ]

  inPacket getSocketAddress() )

  //控制是否需要添加该用户的旗标

  boolean addFlag = true;

  ArrayList<Integer> delList = new ArrayList<Integer>()

  //遍历系统中已有的所有用户 该循环必须循环完成

  for (int i = ; i < lanTalk getUserNum() ; i++ )

  

  UserInfo current = lanTalk getUser(i)

  //将所有用户失去联系的次数加

  current setLost(current getLost() + )

  //如果该信息由指定用户发送过来

  if (current equals(user))

  

  current setLost( )

  //设置该用户无须添加

  addFlag = false;

  

  if (current getLost() > )

  

  delList add(i)

  

  

  //删除delList中的所有索引对应的用户

  for (int i = ; i < delList size() ; i++)

  

  lanTalk removeUser(delList get(i))

  

  if (addFlag)

  

  //添加新用户

  lanTalk addUser(user)

  

  

  //读到的内容是公聊信息

  else

  

  //处理读到的信息

  lanTalk processMsg(inPacket false)

  

  

  //捕捉异常

  catch (IOException ex)

  

  ex printStackTrace()

  if (socket != null)

  

  //关闭该Socket对象

  socket close()

  

  JOptionPane showMessageDialog(null

   接收信息异常 请确认 端口空闲 且网络连接正常!

   网络异常 JOptionPane ERROR_MESSAGE)

  System exit( )

  

  

  

  

  

       返回目录 疯狂Java讲义

       编辑推荐

       Java程序性能优化 让你的Java程序更快 更稳定

       新手学Java 编程

cha138/Article/program/Java/hx/201311/27256

相关参考

知识大全 使用MulticastSocket实现多点广播(2)

疯狂Java讲义:使用MulticastSocket实现多点广播(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

知识大全 使用MulticastSocket实现多点广播(4)

疯狂Java讲义:使用MulticastSocket实现多点广播(4)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

建筑物有线广播的设置原则?

  二锅头  1公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为:  (1)业务性广播系统。  (2)服务性广播系统。  (3)火灾事故广播系统。  2办

建筑物有线广播的设置原则?

  二锅头  1公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为:  (1)业务性广播系统。  (2)服务性广播系统。  (3)火灾事故广播系统。  2办

建筑物有线广播的设置原则有哪些?

1.公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为:  (1)业务性广播系统。  (2)服务性广播系统。  (3)火灾事故广播系统。  2.办公楼、商业

建筑物有线广播的设置原则有哪些?

1.公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为:  (1)业务性广播系统。  (2)服务性广播系统。  (3)火灾事故广播系统。  2.办公楼、商业

火灾应急广播设置要求是什么?

  1、控制中心报警系统、集中报警系统宜设置火灾应急广播;  2、民用建筑内扬声器应设在走道和大厅等公共场所;  3、火灾时应能将火灾疏散层的场声器和公共广播强制专转入火灾应急广播状态;  4、消控室

火灾应急广播设置要求是什么?

  1、控制中心报警系统、集中报警系统宜设置火灾应急广播;  2、民用建筑内扬声器应设在走道和大厅等公共场所;  3、火灾时应能将火灾疏散层的场声器和公共广播强制专转入火灾应急广播状态;  4、消控室

室外架设广播馈电线路的一般规定?

(1)广播馈电线宜采用控制电缆。  (2)与路灯照明线路同杆架设时,广播线应在路灯照明线的下面,两种导线间的最小垂直距离不应小于1m。  (3)广播馈电线最低线位距地的距离:人行道上,一般不宜小于4.

室外架设广播馈电线路的一般规定?

(1)广播馈电线宜采用控制电缆。  (2)与路灯照明线路同杆架设时,广播线应在路灯照明线的下面,两种导线间的最小垂直距离不应小于1m。  (3)广播馈电线最低线位距地的距离:人行道上,一般不宜小于4.