在UDP通信中,windows端能接收数据包但是无法发送数据包的可能原因我写了一个UDP多人聊天的程序,程序如下:(
在UDP通信中,windows端能接收数据包但是无法发送数据包的可能原因
我写了一个UDP多人聊天的程序,程序如下:(之所以分linux端和windows端是由于编码问题,如有更好的解决办法,希望指点一下)
linux端
- Java code
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端:
- Java code
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的防火墙,没有开启。至于还有什么原因导致这个问题,我实在想不出来,希望大家给点建议,或者看看我的代码有问题么?谢谢了。
[解决办法]
我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。
