java套接字出现问题,赢得';t侦听多个数据报包

java套接字出现问题,赢得';t侦听多个数据报包,java,sockets,udp,package,datagram,Java,Sockets,Udp,Package,Datagram,我正在创建一个服务器(现在称为Server1),它正在与我拥有的另一个服务器(现在称为Server2)通信 服务器1向服务器2发送数据包 Server2应该发回两个数据报包,但我只收到一个 Server2不是问题所在,它发送两个包 我使用Wireshark嗅探离开和来到Server1的包 第一包(来自wireshark): “5955 11994.023974 192.168.1.3 192.168.1.2 UDP源 港口:50000目的港:50004“ 第二包(来自wireshark):

我正在创建一个服务器(现在称为Server1),它正在与我拥有的另一个服务器(现在称为Server2)通信

  • 服务器1向服务器2发送数据包
  • Server2应该发回两个数据报包,但我只收到一个
  • Server2不是问题所在,它发送两个包
我使用Wireshark嗅探离开和来到Server1的包

第一包(来自wireshark): “5955 11994.023974 192.168.1.3 192.168.1.2 UDP源 港口:50000目的港:50004“

第二包(来自wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2无法访问ICMP目标(无法访问端口)

Server1运行一个正在侦听数据报包的线程

代码服务器1:

     while (m_keepRunning)
    {
        try
        {
         TermMsg receivedMessage = null;
         receivedMessage = receive();   //See this function further down
         if (receivedMessage != null)
            {
                if (receivedMessage.getMsgType().equals(TermMsgType.ACK))
                {
                 System.out.println("This is an ack!");
                }
                else
                {

                 System.out.println("This is a response");
                }
            }
         else
         {
          System.out.println("This is nothing");
         }

        }
接收功能:

      private TermMsg receive() throws IOException, TermMsgException
{
  byte[] inBuf = new byte[BUF_SIZE_RX];
  DatagramPacket inData = new DatagramPacket(inBuf, BUF_SIZE_RX);

    if(true == firstEncounter)
    {
            StartMessage startReq = getStartMsg(false);
     DatagramPacket p = makeDatagramP(startReq);
     socket.send(p);
     firstEncounter = false;
    }

    socket.receive(inData);
    if (inData.getLength() > 0)
    {
        Msg msg;
        try
        {
            msg = Msg.createFromUdp(inData.getData());
            return msg;
        }
        catch (TermMsgException e1)
        {
            return null;
        }
    }
    else
    {
     try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {

        }
        return null;
    }
}
有人有线索吗? 顺便提一下我还使用:

DatagramSocket socket;
try {
  socket = new DatagramSocket(50004);
}
我是否必须使用服务器套接字使其侦听多个数据报包

总结: -无法到达的端口 -无法收到2号包裹

希望有人能帮助我。
提前感谢

第一个问题,正如在问题的评论中已经提到的,是假设下面两行是正在发送的两个UDP数据包

Package one(from wireshark): "5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004"

Package two(from wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable (Port unreachable)
实际上,这可能是一个不完整的跟踪,因为它显示了两个包:

Package one(from wireshark): "5955 11994.023974 192.168.1.3 192.168.1.2 UDP Source port: 50000 Destination port: 50004"
这是一个UDP数据包,从server2(192.168.1.3)到server1(192.168.1.2)。正在将其发送到服务器1上的端口50004

Package two(from wireshark): 5958 11994.045830 192.168.1.3 192.168.1.2 ICMP Destination unreachable (Port unreachable)

这是一条从server2发送到server1的控制消息,表示由于目标端口未打开,无法传递上一个数据包。这是上一次从server1到server2的数据包传递尝试的答案,但没有成功。这可能有助于解释为什么您没有收到预期的所有数据包?

为什么您认为您正在从server2发送两个数据包?我不知道wireshark,但在我看来,您只发送了一个UDP数据包。第二条日志消息似乎是一个ICMP数据包,这是一个不同的协议。我认为ICMP是一条可以告诉您udp或tcp数据包是否未达到其目标的消息。但看起来你是对的。创建了一个向Server1发送包的小客户端,它会做出响应。看起来Server2根本不发送两个包。“这是以前从server1到Server2的包传递尝试的答案”-这是我一直在想的,但我不明白为什么它不能到达目的地。-正如我在另一篇评论中所说,我制作了一个脚本,发送了ti Server1包,它们达到了目标。它仍然显示了wireshark的包2,但我现在已经完成了接收两个包的工作。感谢大家的集思广益;kdgregory和Paul Wagland:)是否有防火墙阻止对端口的访问?