0

興味深い質問があります。クライアントプロセスがサーバーとクライアントの両方として機能することを意味するピアツーピア接続を確立しようとしています。理想的には、クライアント ソケット (Socket クラス) とサーバー ソケット (Server Socket クラス) を持つ必要があります。今、私はこの概念を使用しようとしましたが、うまくいきません。それを見てください:

  public static void main(String argv[]) throws Exception
  {

  Socket clientSocket = null;


  BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
  DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());



 System.out.println("Enter the server port u want to be assigned to this peer:"); 
 sentence = inFromUser.readLine(); 
 System.out.println("writing current port to client = "+ sentence);
 outToServer.writeBytes("p~"+sentence + "\n" );

 int serverport = Integer.parseInt(sentence);

ServerSocket server = new ServerSocket(serverport);
Socket client;
//client 
System.out.println("enter port no of the server port of an other peer:");
               int msg=Integer.parseInt(inFromUser.readLine());
               clientSocket = new Socket("localhost", msg);
                outToServer = new DataOutputStream(clientSocket.getOutputStream());
               outToServer.writeBytes("hi");

    while(true)
    {
         //server port listens infinitely and spawns new thread
          System.out.println("inside true");
       client = server.accept();
      Thread serverThread = new Thread(new acceptconnection1(client));
        serverThread.start();

    }}}

class acceptconnection1 implements Runnable {
 BufferedReader inFromClient, inn; 
 DataOutputStream ds;
 Socket socket;
  int peersocket;

 String clientSentence;

         int serverport ;

    Socket clientSocket = null;
acceptconnection1 (Socket socket,) throws IOException{

this.socket = socket;

 inn = new BufferedReader (new InputStreamReader(System.in));
      inFromClient =new BufferedReader(new InputStreamReader(socket.getInputStream()));
  ds = new DataOutputStream(socket.getOutputStream());
}

@Override
public void run () {

        String cs,a;
    try {
            System.out.println("waiting for connection ");

             if(( clientSentence = inFromClient.readLine())!=null)
             {

            System.out.println("Message from other peer" + clientSentence);

             }


    } catch (IOException ex) {
        Logger.getLogger(acceptconnection1.class.getName()).log(Level.SEVERE, null, ex);
    }}}

出力: 2 つのクライアント プロセスを作成すると、

o/p of client1: このピアに割り当てたいサーバーポートを入力してください: 1111 現在のポートをクライアントに書き込んでいます = 1111 hi 接続先のポート番号を入力してください: 2222 inside true inside true 接続を待っています

このピアに割り当てたいサーバーポートを入力してください: 2222 クライアントへの現在のポートの書き込み = 2222 hi 接続先のポート番号を入力してください: 1111 内部 true 内部 true 接続を待機中

何が起こるかは、両方が接続を待つことです。どうすればこれを解決できますか?

4

1 に答える 1

1

デッドロック状態になっています。これを実現するには、最初に ServerSocket を作成して、Socket が通信できるようにします。接続するソケットを作成しますが、受け入れられるまで何もしません。次に、接続を受け入れます。

ところで: トラフィックが双方向に通過するために 2 つの接続を作成する必要はありません。接続が確立されると、その 1 つの接続をクライアント サーバーまたはサーバー サーバーなどとして使用できます。

于 2012-09-21T08:14:18.037 に答える