0
- デフォルトのコンストラクタを使用してクライアントソケットを作成します。
- 私は新しいとACKを送信する私は、サーバー側
- に新しいソケットを作成するポート45500
- にサーバー側でパケットを受信したポート45500.
- 上のサーバにパケットを送信しますserverSocket私は、サーバー側で新しいソケットを作成し、ちょうど
- I(ハードコードされたポート45500で)古いソケットでACKを送信しない場合を除きACKがreceivedPacket.getport()に送信され
- クライアントは何も受信しません何が起こっているのか分からない!両側のwindows10のファイアウォールを無効に
クライアントサーバーソケットポートがハードコードされていない限り、クライアントソケットはサーバーソケットから受信できません。
DatagramSocket clientSocket = new DatagramSocket();
byte[] receiveData = new byte[5000];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
byte[] connection = connectionRequest.getBytes();
InetAddress IPAdress = InetAddress.getByName("169.xxx.xx.xxx");
DatagramPacket packet = new DatagramPacket(connection, connection.length, IPAdress, 45500);
clientSocket.send(packet);
// doesn't receive unless port #45500 on server side sends!
clientSocket.receive(receivePacket);
サーバー
DatagramSocket connectionSocket = new DatagramSocket(45500);
byte[] receiveData = new byte[5000];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
connectionSocket.receive(receivePacket);
int clientPort = receivePacket.getPort();
InetAddress IP = receivePacket.getAddress();
byte[] sendData = ("accepted").getBytes();
DatagramSocket serverSocket = new DatagramSocket();
// doesn't work unless connectionSocket (port 45500) sends!
serverSocket.send(new DatagramPacket(sendData, sendData.length, IP, clientPort));
これはUDPホールパンチングの問題ですが、なぜ2番目のソケットを作成していますか? – EJP
私のサーバは同時にいくつかのクライアントからのファイル転送を受け入れる必要があり、どれくらいの数があるかわからないので、事前にハードコードされたポートでいくつかの待機スレッドを実行することはできません。私は、接続を待っている1つのスレッドを持って、それを受け取ると、接続要求に関連付けられているそのファイル転送の新しいソケットを持つ新しいスレッドを作成します。私はUDPホールパンチを調べます。 – Chuque
セキュリティマネージャがありますか?あなたはそれをテストしましたか?私のために完璧に動作します! – gpasch