UDP映像传输依赖于网络

时间:2014-12-11 19:48:26

标签: java sockets udp

我的程序有一个客户端/服务器,服务器使用UDP从网络摄像头向客户端发送实时图像流。服务器在我的工作,而客户端可以从任何地方在线访问。 图像的发送和接收完全正常 - 有时候。我注意到,根据客户端的不同,他们可能会或可能不会接收图像。我有来自几个不同地点的几个人访问在线客户端,其中一些人可以完美地接收图像,而其他人则无法接收任何图像。

无法接收图像的图像可以使用相同的端口从服务器接收消息。

确保计算机没有问题。我在工作时用笔记本电脑测试了客户端,并且能够接收图像。但是,当我连接到我的家庭网络(使用相同的笔记本电脑)时,我不能。我只能认为问题与不同的网络有关,因为这是唯一改变的事情。

SendImage代码:

public void sendImage()
{
      //  get image as bytes for UDP communication
     ByteArrayOutputStream baStream =null;

     try {
        //compresses image file and returns a ByteArrayOutputStream
            baStream =compress(cap.getOneFrame(),0.1f); 
        } catch (IOException e1) {
            e1.printStackTrace();
        }
     //byte array to send via udp
       packet = baStream.toByteArray();

      try {

        sendPacket=(new DatagramPacket(packet,packet.length,IPAddress,port));
        System.out.println(sendPacket.getLength());
        serverSocket.send(sendPacket);
      } 
      catch (Exception e) {
        e.printStackTrace();
      }
}

检索图像代码:

public void receiveImage()
{
    //receive the incoming packet
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
    try {
        clientSocket.receive(receivePacket);
    }
     catch (IOException e) {
        e.printStackTrace();
    }
    //retrieve the data from the packet
    byte[] data = receivePacket.getData();
      // Read incoming data into a ByteArrayInputStream
      ByteArrayInputStream bais = new ByteArrayInputStream( data );
      try 
    {
          //convert to buffered image
        BufferedImage img = ImageIO.read(bais);
        if (img != null) 
        {
                gui.getBottomCamPanel().setImage(img);
                gui.getBottomCamPanel().repaint();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:0)

,取决于网络类型。更具体地,在不同网络中使用的不同网络地址转换(NAT)方案导致这种情况。客户端无法接收图像的原因是防火墙阻止了UDP数据包

路由器的防火墙允许传出UDP数据包,但默认阻止传入的UDP数据包。 它只允许来自先前发送UDP数据包的源的传入数据包,并在其路由表中创建映射。对于不同类型的NAT,这总体上是一个典型的过程。

取决于客户端所连接的路由器使用的NAT类型,内部IP和端口映射您系统的正在使用外部IP和端口路由器分配的那些连接到互联网)是不同的。

您需要了解不同类型的NAT(或NAPT)以及如何创建这些映射。

没有可用的通用解决方案来解决此问题。在某种程度上, UDP打孔解决了这个问题,但也不适用于对称NAT

详细了解NAT方案。一些消息来源是:

Network Address Translation RFC 1631

NAT behavioral requirements for Unicast UDP RFC 4787

NAT

Types of NAT