Android UDPイントラネット接続外部ネットワークサーバ

2554 ワード

最近、プロジェクトでUDPを使って接続するように要求されたが、以前はTCPしかやっていなかったので、UDPは内外のネット通信ができないと思っていた.
長い間悩んでいたが、やっとネットで検索して、穴を開けるのはどういうことなのか分かった.
私の愚見によると、穴を開けるのは、イントラネットマシンA(192.168.0.2211.11.11.11)が外部ネットワークマシンB(211.22.22)にメッセージを送信すると、データがAのあるルータを通過すると、ルータはデータの送信者のアドレスとポート、データ受信者のアドレスとポートを記録し、データを転送するためにポートを割り当てます.次のデータがBの同じポートからこの割り当てられたポートに送信されると、ルータは前に記録されたイントラネットマシンAに直接転送され、穴を開けることができます.
つまり、この方法は少なくとも一端が外網であり、tcpと同じであるが、両端が内網である場合、やはり穴を開ける者として外網機械が必要であり、両端に穴を開ける具体的な方法は、私にも分からない.
UDP実装のコードを見てみましょう.
 
    public static DatagramSocket DATA_SOCKET;

   /**
     *           
     * @param port
     */
    public static boolean BondPort(int port) {
        try {
            DATA_SOCKET = new DatagramSocket(port);
            ReceiveThread().start();
            return true;
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            if (PORT >= 65535) return false;
            e.printStackTrace();
            return BondPort(++PORT);
        }
    }

このような方法でUDPのsocketを作成することができます.
しかし、送受信データはTCPのようにストリームを構築する必要はありません.データを送受信するためにDatagramPacketを定義する必要があります.
受信データと送信データのDatagramPacket定義は少し異なります.
    /**
     *     
     * @param buff
     * @return
     */
    public static int Send(byte[] buff) {
        try {
            DatagramPacket dataPacket = new DatagramPacket(buff, buff.length, InetAddress.getByName(SERVER_IP), PORT);
            DATA_SOCKET.send(dataPacket);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }

 
    /**
     *        
     *        DataProcess       
     * @return
     */
    public static Thread ReceiveThread() {
        return new Thread() {
            @Override
            public void run() {
                byte[] receiveByte = new byte[512]; //         
                DatagramPacket dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
                while (true)//    ,   
                {
                    try {
                        DATA_SOCKET.receive(dataPacket); //     
                        if (dataPacket.getLength() > 0) {
                            ServerProcess.Process(receiveByte);
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

        };
    }