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