当前位置: 代码迷 >> J2SE >> 急局域网中的java多点组播,不同电脑其间不能收发消息
  详细解决方案

急局域网中的java多点组播,不同电脑其间不能收发消息

热度:81   发布时间:2016-04-23 19:51:11.0
急!!!局域网中的java多点组播,不同电脑之间不能收发消息
网上找的例子,我在本地计算机开启多个是可以通信,但是在局域网中的另一台机器就是不能接受或发送到我本机上,即不同机器二者不能相互通信,不知道各位是否砬到过,希望大家帮我看下,如能解决,可以现金酬谢,不胜感激!!
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import javax.swing.*;
public class MutilCast {
    public static void main(String[] args)
    {
        MulticastSocket s              = null;
        InetAddress group               = null;    
        JPanel northPanel               =new JPanel();   
        JPanel southPanel               =new JPanel();
        JPanel namePanel                =new JPanel(new FlowLayout());
        JLabel sendLabel                =new JLabel("发送内容:");
        JLabel nameChangeLabel          =new JLabel("给自己起个名字:");
final    JTextField nameSpace           =new JTextField(20);
final    JTextArea messageArea          =new JTextArea("",20,20);
final    JTextField sendField            =new JTextField(30);
        JScrollPane message              =new JScrollPane(messageArea);
        JButton sendButton               =new JButton("发送");
        JButton saveButton               =new JButton("保存记录");
        JButton clearUpButton            =new JButton("清空面板");
        Box    centerBox                  =Box.createVerticalBox();
        namePanel.add(nameChangeLabel);
        namePanel.add(nameSpace);
        centerBox.add(namePanel);
        centerBox.add(message);   
      //实现组播数据传送的配置信息
        try {
             group = InetAddress.getByName("228.9.6.8");
        } catch (UnknownHostException e1) {
            System.out.println("组播地址绑定失败");
        }      
        try {
            s = new MulticastSocket(6789);
            s.setTimeToLive(1);
        } catch (IOException e1) {
            System.out.println("组播地址创建失败");
        }
        try {
                s.joinGroup(group);
        } catch (IOException e1) {
            System.out.println("组播地址加入失败");
        }
      //end实现组播数据传送的配置信息
      //“发送”按钮实现信息功能的发送部分                  
        class SendMsg implements ActionListener
        {
            String msg=null;         
            MulticastSocket s=null;
            InetAddress group = null;
            public SendMsg(MulticastSocket s,InetAddress group)
            {
                this.s=s;
                this.group=group;
            }
            public void actionPerformed(ActionEvent e)
            {              
                 try
                {
                     //如果名字为空 给出提示信息
                    if(nameSpace.getText().isEmpty())                   
                        new JOptionPane().showMessageDialog(null, "请一定要取别名!");
                    else
                    {
                    //如果名字不为空 则把名字添加到数据报头
                    msg=(nameSpace.getText()+"说:"+sendField.getText());
DatagramPacket data=
 new DatagramPacket(msg.getBytes(),msg.getBytes().length,group, 6789);
                    s.send(data);
                    }
                 }
                 catch (IOException e1) {
                    System.out.println("发送失败");
                }      
            }
        }
         //实现数据报的接受线程      
        class  recevMsg extends Thread
        {
             MulticastSocket s=null;
             public recevMsg(MulticastSocket s)
             {
                 this.s=s;
             };
             public void run()
             {
                 byte[] buf = new byte[100];
                DatagramPacket recv = new DatagramPacket(buf, buf.length);
                 try
                 {
                     while(true)
                     {
                         s.receive(recv);
                         String str=new String(recv.getData());
                          String line =System.getProperty("line.separator");
                         messageArea.append(str);
                         messageArea.append(line);
                     }
                 }
                 catch (IOException e1)
                 {
                     System.out.println("接受失败");
                 }
             }
        }
       //聊天记录的保存 保存在当前位置下的"Note.txt"文件中
        class SaveMsg implements ActionListener
        {
            String msg=null;
            String line =System.getProperty("line.separator");
            public void actionPerformed(ActionEvent e)
            {              
                 try
                 {
                    msg=messageArea.getText();
                     FileOutputStream Note=new FileOutputStream("Note.txt");
                    messageArea.append("记录已经保存在Note.txt");
                    Note.write(msg.getBytes());
                    messageArea.append(line);
                    Note.close();
                 }
                 catch (IOException e1) {
                    System.out.println("发送失败");
                }      
            }
        }
        //清除面板上的聊天记录
        class ClearMsg implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {              
                 try
                 {
                     messageArea.setText("");
                 }
                 catch (Exception e1) {
                    System.out.println("清空失败");
                }      
            }
        }
        JFrame mutilCastFrame=new JFrame("组播聊天工具");
        northPanel.add(sendLabel);
        northPanel.add(sendField);
        northPanel.add(sendButton);
        southPanel.add(saveButton);
        southPanel.add(clearUpButton);
        mutilCastFrame.getContentPane().add(northPanel,"North");
        mutilCastFrame.getContentPane().add(southPanel,"South");  
        mutilCastFrame.getContentPane().add(centerBox,"Center");
mutilCastFrame.setDefaultCloseOperation(mutilCastFrame.EXIT_ON_CLOSE); 
sendButton.addActionListener(new SendMsg(s,group));
        saveButton.addActionListener(new SaveMsg());
        clearUpButton.addActionListener(new ClearMsg());
        mutilCastFrame.setSize(500, 500);
        mutilCastFrame.setLocation(200, 200);
        mutilCastFrame.show();
        recevMsg r=new recevMsg(s);
        r.start();
        }
}
------解决思路----------------------
什么网络环境?无线网的话大多默认禁止组播。

这类问题优先检查 路由设置,防火墙设置之类的问题。广播一般都是优先封杀的。
------解决思路----------------------
group = InetAddress.getByName("228.9.6.8");
228网段属于D类网段,D类网段多用于多路广播,先确保你这几台电脑在一个局域网内,且属于同一个网段,再检查各个终端的防火墙之类的是否关闭了。
------解决思路----------------------
192的去通信228?不在一个局域网,肯定不行的。
------解决思路----------------------
首先看看每个节点是不是在同一个网段,中间有没有数据经过三层交换机或者路由器。
如果存在转发节点,就要去查看路由表或者访问控制表,是否将组播信息拦截掉了,或者转发错端口了。
如果在同一个子网内,消息基本不会被其他节点拦截,那就要查一下各自电脑上的防火墙,或者,网络安全软件,是否将组播的报文拦截掉了。
如果是裸奔的情况下,仍然无法进入组播环境,查看一下系统服务或者应用程序,组播服务的相关功能(端口啊之类的信息)是否能够正常使用。
------解决思路----------------------
这种情况,首先考虑到的问题是网关把你的数据给拦截了,还有就是防火墙,本地测试可以,就可以说明以上的问题
------解决思路----------------------
引用:
to 1 楼: 是无线网络环境,防火墙已经关了的。哦,应该是不是通过路由器设置?


拿根网线(普通网线即可),直接把两台电脑给对接起来,关闭所有防火墙,看看能不能正常通讯。

不能说明程序上还有问题要调整。
能说明无线路由安全策略要调整。
------解决思路----------------------
不在一个网段,肯定要经过vpn的,除非ip是公网ip
------解决思路----------------------
挺好的,已经开发出一个 即时通讯服务 的雏形了
  相关解决方案