在UDP通信中,windows端能接收数据包但是无法发送数据包的可能原因

时间:2022-09-14 18:55:37
我写了一个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的防火墙,没有开启。至于还有什么原因导致这个问题,我实在想不出来,希望大家给点建议,或者看看我的代码有问题么?谢谢了。

6 个解决方案

#1


1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。

#2


MulticastSocket 多点传送,没用过。

#3


引用 1 楼  的回复:
1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。

MullticastSocket专门用来一对多通信,运行程序即可加入广播组,发送消息是向广播组发送,任何在这个广播组的成员都可以接收消息。
 addr=InetAddress.getByName("230.0.0.1");//创建一个广播组地址
        socket=new MulticastSocket(port);//创建socket
            socket.joinGroup(addr);//加入广播组

每个客户端运行程序都会执行这三部。

#4


引用 1 楼  的回复:
1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。

我上面的程序仅仅是对MulticastSocket的一个练习。对于一个做一个功能全面逻辑清楚的java聊天程序的整体构架也不是很清楚,正在寻找参考代码学习一下。

#5


我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。

#6


引用 5 楼  的回复:
我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。

今天我再次测试,确定一个问题,昨天出现第三方无法发送消息的原因是我用了虚拟机参与测试,今天我又是用笔记本,笔记本上的xp虚拟机,第三方xp参与测试,又出现了问题,昨天是第三方xp无法发送,今天是虚拟机无法发送,然后我找来另一台win7笔记本,然后三台实体机一起测试,结果三台机器之间能实现群聊功能,虽然通过无线路由连接起来有丢包现象,但是最起码代码是正确的,至于sockket.setLoopbackMode()这个方法与我出现的问题没有关系,谢谢回答。

#1


1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。

#2


MulticastSocket 多点传送,没用过。

#3


引用 1 楼  的回复:
1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。

MullticastSocket专门用来一对多通信,运行程序即可加入广播组,发送消息是向广播组发送,任何在这个广播组的成员都可以接收消息。
 addr=InetAddress.getByName("230.0.0.1");//创建一个广播组地址
        socket=new MulticastSocket(port);//创建socket
            socket.joinGroup(addr);//加入广播组

每个客户端运行程序都会执行这三部。

#4


引用 1 楼  的回复:
1.感觉你这程序实现双人还可以,如果有第三人加入,你的信息怎么发过去。
2.建议加入中介服务,转发信息。减少逻辑。要不点对点有点麻烦。

我上面的程序仅仅是对MulticastSocket的一个练习。对于一个做一个功能全面逻辑清楚的java聊天程序的整体构架也不是很清楚,正在寻找参考代码学习一下。

#5


我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。

#6


引用 5 楼  的回复:
我在网上看了些代码。自己也做了测试。第三方能收到消息,说明他已经加到了group中,剩下的问题是为什么他发送的消息别人接收不到。socket.setLoopbackMode(true);把这个设置为false试试,这个是会发回给自身。如果收到自己的消息,说明已经传到服务器上了,剩下就是验证服务器为什么不转发给其他客户端。

今天我再次测试,确定一个问题,昨天出现第三方无法发送消息的原因是我用了虚拟机参与测试,今天我又是用笔记本,笔记本上的xp虚拟机,第三方xp参与测试,又出现了问题,昨天是第三方xp无法发送,今天是虚拟机无法发送,然后我找来另一台win7笔记本,然后三台实体机一起测试,结果三台机器之间能实现群聊功能,虽然通过无线路由连接起来有丢包现象,但是最起码代码是正确的,至于sockket.setLoopbackMode()这个方法与我出现的问题没有关系,谢谢回答。