我写了一个UDP多人聊天的程序,程序如下:(之所以分linux端和windows端是由于编码问题,如有更好的解决办法,希望指点一下)
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的防火墙,没有开启。至于还有什么原因导致这个问题,我实在想不出来,希望大家给点建议,或者看看我的代码有问题么?谢谢了。
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的防火墙,没有开启。至于还有什么原因导致这个问题,我实在想不出来,希望大家给点建议,或者看看我的代码有问题么?谢谢了。
addr=InetAddress.getByName("230.0.0.1");//创建一个广播组地址
socket=new MulticastSocket(port);//创建socket
socket.joinGroup(addr);//加入广播组
每个客户端运行程序都会执行这三部。