网上找的例子,我在本地计算机开启多个是可以通信,但是在局域网中的另一台机器就是不能接受或发送到我本机上,即不同机器二者不能相互通信,不知道各位是否砬到过,希望大家帮我看下,如能解决,可以现金酬谢,不胜感激!!
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?不在一个局域网,肯定不行的。
------解决思路----------------------
首先看看每个节点是不是在同一个网段,中间有没有数据经过三层交换机或者路由器。
如果存在转发节点,就要去查看路由表或者访问控制表,是否将组播信息拦截掉了,或者转发错端口了。
如果在同一个子网内,消息基本不会被其他节点拦截,那就要查一下各自电脑上的防火墙,或者,网络安全软件,是否将组播的报文拦截掉了。
如果是裸奔的情况下,仍然无法进入组播环境,查看一下系统服务或者应用程序,组播服务的相关功能(端口啊之类的信息)是否能够正常使用。
------解决思路----------------------
这种情况,首先考虑到的问题是网关把你的数据给拦截了,还有就是防火墙,本地测试可以,就可以说明以上的问题
------解决思路----------------------
拿根网线(普通网线即可),直接把两台电脑给对接起来,关闭所有防火墙,看看能不能正常通讯。
不能说明程序上还有问题要调整。
能说明无线路由安全策略要调整。
------解决思路----------------------
不在一个网段,肯定要经过vpn的,除非ip是公网ip
------解决思路----------------------
挺好的,已经开发出一个 即时通讯服务 的雏形了