4

1 つのリモート サーバーに接続された 2 つのソケット クライアントを相互接続しようとしています。ケースは次のとおりです。

  • Client_1] サーバーに接続
  • Client_2] サーバーに接続
  • Server] Client_1 と Client_2 の間にトンネルを作成します
  • Client_1] 「何か」を書く
  • Client_2] (いくつかのメッセージを待っている) Client_1 によって「何か」を受け取る

およびその逆。

それが私のコードです:

package jtestsock;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

/**
 *
 * @author massimodeluisa
*/
public class Server extends Thread{

private List<Socket> clients;
private ServerSocket server;
private int port = 5001;
private BufferedReader input;
private PrintWriter output;

public Server() {
    try {
        server = new ServerSocket(port);
        
    } catch (IOException e) {
        System.out.println("Impossibile istanziare il server: "+e.getMessage());
    }
}

@Override
public void run() {
    System.out.println("Waiting for client message...");

    //
    // The server do a loop here to accept all connection initiated by the
    // client application.
    //
    while (true) {
        try {
            Socket socket = server.accept();
            System.out.println("Connection Received!");
            
            clients.add(socket);
            

            /* read response */
            input = new BufferedReader(
                    new InputStreamReader(
                    socket.getInputStream()));

            output = new PrintWriter(
                    new BufferedWriter(
                    new OutputStreamWriter(
                    socket.getOutputStream())));
            
            if(clients.size()>0){
                Socket first    = new Socket();
                Socket second   = new Socket();
                
                first = clients.get(1);
                second= clients.get(2);     // || second = socket;
                
                // ??? Tunneling input and output between two clients
            }
            
        } catch (IOException e) {
            System.out.println("Client connection error: "+e.getMessage());
        }
    }
}
}

誰でも私を助けてもらえますか?ありがとう :)

アップデート:

2 つのクライアント間でポイント ツー ポイント接続を確立し、プロキシ サーバーのように自分のサーバーに渡したいと考えています...

サーバーは 2 つ以上の接続を受け入れる必要があり、一方のクライアントから他方のクライアントにメッセージをリダイレクトする書き込みと読み取りのためにサーバー上に 2 つのスレッドを作成すると、CPU が飽和状態になります。

(Ps. 私の英語で申し訳ありません XD)

4

1 に答える 1