前提・実現したいこと
現在javaで,端末間でP2P通信が出来るようなリアルタイムコミュニケーションアプリ(公には出さないアプリ)を自作しています.
その際に,NAT越えなどに必要なSTUNサーバ,Singnalingサーバをpc側で担おうと考えています.
クライアント側の処理をandroid studio
サーバ側の処理をeclipseで書き,それぞれ実行しています.
しかしlogを見ると,クライアントによるパケット送信処理までは進むのですが,STUNサーバのsocket.receive.();まで届いていないため,その後のステップに処理が流れません.おそらく,端末とPC間で通信が出来ていないとは推測できるのですが,なぜできないのか,何の処理が不足しているのかが分かりません.
1つのpc上でクライアントとサーバを担うプログラムをそれぞれの起動すると動くのですが,クライアントの処理をandroid端末で実装すると通信が出来ません。
以下を設定
STUNサーバ IP:"127.0.0.1",port:55554 Singnalingサーバ IP:"127.0.0.1",port:55555
可読性が良くないですが,コードを載せておきます.
(1) eclipse上で以下のSTUNサーバの受信クラスを実行しておきます.
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPHolePunchingServerReceive extends Thread { DatagramSocket serverSocket; UDPHolePunchingServerReceiveListener udpHolePunchingServerReceiveListener; UDPHolePunchingServerReceive(DatagramSocket datagramSocket,UDPHolePunchingServerReceiveListener udpHolePunchingServerReceiveListener){ this.serverSocket = datagramSocket; // datagramSocket = new DatagramSocket(port) port = 55554 this.udpHolePunchingServerReceiveListener = udpHolePunchingServerReceiveListener; } public void run(){ if(serverSocket == null) { System.out.println( "socket is null"); } while(true) { // receive Data DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024); try { serverSocket.receive(receivePacket); // android studioの送信パケットが届かない String getMsg = new String(receivePacket.getData(), 0, receivePacket.getLength()); if(getMsg.equals("Hello")){ udpHolePunchingServerReceiveListener.onReceiveMsg(receivePacket); System.out.println("UDPHolePunchingReceive;getMsg:"+getMsg); }else{ System.out.println("UDPHolePunchingReceive;getMsg:"+getMsg); } } catch (IOException e) { System.out.println( "受信失敗"+e); } } } }
(2) android studioから以下のSTUNサーバへの送信クラスを実行します.
import android.os.AsyncTask; import android.util.Log; import com.example.g_lockonbyaw.main.UtilCommon; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class STUNServerClientSend extends AsyncTask<String, String, Integer> { private DatagramSocket socket; ISTUNServerClientSend iSendSTUNServerClient; //コンストラクタ STUNServerClientSend(DatagramSocket socket, ISTUNServerClientSend iSendSTUNServerClient){ this.socket = socket; this.iSendSTUNServerClient = iSendSTUNServerClient; } // 自端末からSTUN Serverへpingを送り続ける @Override protected Integer doInBackground(String... ttt) { String sendMsg = "Hello"; UtilCommon utilCommon = (UtilCommon) UtilCommon.getAppContext(); String stunServerIP = utilCommon.getStunServerIP(); // "127.0.0.1" int stunServerPort = utilCommon.getStunServerPort(); // 55554 while(true) { try{ byte[] sendData = sendMsg.getBytes(); DatagramPacket sendPacket = new DatagramPacket( sendData, sendData.length, InetAddress.getByName(stunServerIP), stunServerPort ); socket.send(sendPacket); //ping 送信 if(sendMsg.equals("Hello")){ sendMsg = "Ping"; iSendSTUNServerClient.onSentHelloMsgToStun(); } Log.d("STUNServerClientSender","doInBackgroundが呼ばれたよ"); sleep(); }catch (Exception e){ e.printStackTrace(); } } } private void sleep(){ try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } }
疑問
サーバについて実装したことがないため,詳しくないのですが,
通信を行う場合,「クライアントとサーバ側の最低2つの実行構成が必要である」という認識で合っていますか.
私は,この認識の基,クライアントの実装をandroid studioで,サーバ側の実装をeclipse上で実行しています.
補足情報(FW/ツールのバージョンなど)
android studio: 4.2
eclipse: Version: 2020-12 M1 (4.18.0 M1)
回答2件
あなたの回答
tips
プレビュー