linux端
import java.net.*;
import java.util.*;
/**
*利用MulticastSocket实现多人聊天---linux端
*/
public class MainClass5 extends Thread
{
private int port=8888;
private InetAddress addr=null;
private DatagramPacket inPacket=null;//接收数据包
private DatagramPacket outPacket=null;//发送数据包
private MulticastSocket socket=null;
private Scanner sc=null;
private byte[] inBuffer=null;
private byte[] outBuffer=null;
/**
*初始化实例 ,
*/
public void init()
{
try
{
addr=InetAddress.getByName("230.0.0.1");
socket=new MulticastSocket(port);
socket.joinGroup(addr);
socket.setNetworkInterface(NetworkInterface.getByName("wlan0"));//设置网络接口后同一台机器上多个客户端间不能通信,类似与一台机器不能登录多个帐号
System.out.println(socket.getNetworkInterface());
socket.setLoopbackMode(true);
sc=new Scanner(System.in);
inBuffer=new byte[1024];
inPacket =new DatagramPacket(inBuffer,inBuffer.length);//接收数据包
new Thread(this).start();//启动run()线程 如果是new MainClass5().start()则会抛出java.lang.NullPointerException
String line;
while(true)
{
line=sc.nextLine();
outBuffer=line.getBytes();
outPacket=new DatagramPacket(outBuffer,outBuffer.length,addr,port);
socket.send(outPacket);
if(line.equals("quit"))
break;
}
socket.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
/**
*实现socket 接收广播数据并且打印到屏幕
*/
public void run()
{
try
{
while(true)
{
socket.receive(inPacket);
System.out.println("Form "+inPacket.getAddress()+" "+new String(inPacket.getData(),0,inPacket.getLength(),"gb2312"));
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
*main entru
*/
public static void main(String[] args)
{
new MainClass5().init();
}
}
windows端:
import java.net.*;
import java.util.*;
/**
*利用MulticastSocket实现多人聊天--windows端
*/
public class MainClass5 extends Thread
{
private int port=8888;
private InetAddress addr=null;
private DatagramPacket inPacket=null;//接收数据包
private DatagramPacket outPacket=null;//发送数据包
private MulticastSocket socket=null;
private Scanner sc=null;
private byte[] inBuffer=null;
private byte[] outBuffer=null;
/**
*初始化实例
*/
public void init()
{
try
{
addr=InetAddress.getByName("230.0.0.1");
socket=new MulticastSocket(port);
socket.joinGroup(addr);
socket.setNetworkInterface(NetworkInterface.getByName("eth0"));
System.out.println("正在使用的网络接口 "+socket.getNetworkInterface());
socket.setLoopbackMode(true);
sc=new Scanner(System.in);
inBuffer=new byte[1024];
inPacket =new DatagramPacket(inBuffer,inBuffer.length);//接收数据包
new Thread(this).start();//启动run()线程 如果是new MainClass5().start()则会抛出java.lang.NullPointerException
String line;
while(true)
{
line=sc.nextLine();
outBuffer=line.getBytes();
outPacket=new DatagramPacket(outBuffer,outBuffer.length,addr,port);
socket.send(outPacket);
if(line.equals("quit"))
break;
}
socket.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
/**
*实现socket 接收广播数据并且打印到屏幕
*/
public void run()
{
//inBuffer=new byte[1024];
//inPacket =new DatagramPacket(inBuffer,inBuffer.length);//接收数据包
try
{
while(true)
{
socket.receive(inPacket);
//
System.out.println("Form "+inPacket.getAddress()+" "+new String(inPacket.getData(),0,inPacket.getLength(),"UTF-8"));
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
*main entru
*/
public static void main(String[] args)
{
new MainClass5().init();
}
}
我在自己的笔记本上(linux)运行linux端程序,在虚拟机(xp)里面运行windows端程序,运行没有问题,可以实现双方通信。然后我在另一台电脑(xp)运行windows端程序(这几个系统已经在一个局域网内,用路由器连同,互相能ping同),然后问题来了,虚拟机xp,笔记本linux,上面都能发送和接收数据,但是另一台xp只能接受数据,也就是虚拟机和linxu聊天,另一台xp干瞪眼看着人家聊天,自己不能说话。
我查看那台xp的防火墙,没有开启。至于还有什么原因导致这个问题,我实在想不出来,希望大家给点建议,或者看看我的代码有问题么?谢谢了。
6 个解决方案
#1
1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。
#2
MulticastSocket 多点传送,没用过。
#3
MullticastSocket专门用来一对多通信,运行程序即可加入广播组,发送消息是向广播组发送,任何在这个广播组的成员都可以接收消息。
addr=InetAddress.getByName("230.0.0.1");//创建一个广播组地址
socket=new MulticastSocket(port);//创建socket
socket.joinGroup(addr);//加入广播组
每个客户端运行程序都会执行这三部。
#4
我上面的程序仅仅是对MulticastSocket的一个练习。对于一个做一个功能全面逻辑清楚的java聊天程序的整体构架也不是很清楚,正在寻找参考代码学习一下。
#5
我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。
#6
今天我再次测试,确定一个问题,昨天出现第三方无法发送消息的原因是我用了虚拟机参与测试,今天我又是用笔记本,笔记本上的xp虚拟机,第三方xp参与测试,又出现了问题,昨天是第三方xp无法发送,今天是虚拟机无法发送,然后我找来另一台win7笔记本,然后三台实体机一起测试,结果三台机器之间能实现群聊功能,虽然通过无线路由连接起来有丢包现象,但是最起码代码是正确的,至于sockket.setLoopbackMode()这个方法与我出现的问题没有关系,谢谢回答。
#1
1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。
#2
MulticastSocket 多点传送,没用过。
#3
MullticastSocket专门用来一对多通信,运行程序即可加入广播组,发送消息是向广播组发送,任何在这个广播组的成员都可以接收消息。
addr=InetAddress.getByName("230.0.0.1");//创建一个广播组地址
socket=new MulticastSocket(port);//创建socket
socket.joinGroup(addr);//加入广播组
每个客户端运行程序都会执行这三部。
#4
我上面的程序仅仅是对MulticastSocket的一个练习。对于一个做一个功能全面逻辑清楚的java聊天程序的整体构架也不是很清楚,正在寻找参考代码学习一下。
#5
我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。
#6
今天我再次测试,确定一个问题,昨天出现第三方无法发送消息的原因是我用了虚拟机参与测试,今天我又是用笔记本,笔记本上的xp虚拟机,第三方xp参与测试,又出现了问题,昨天是第三方xp无法发送,今天是虚拟机无法发送,然后我找来另一台win7笔记本,然后三台实体机一起测试,结果三台机器之间能实现群聊功能,虽然通过无线路由连接起来有丢包现象,但是最起码代码是正确的,至于sockket.setLoopbackMode()这个方法与我出现的问题没有关系,谢谢回答。