3

2人でサーバーに接続しようとしていますが、サーバーは2人の間に接続を設定します。その後、彼らはお互いに話すことができます。「HEREEEEEEEEEEEEEEEEEE」というコメントを見ると、thread.sleepがあり、なんらかの理由でthread.sleep()で動作しますが、取り出した場合、パートナーに送信できるのは1人だけです。 thread.sleep();ではありません。

PSそれはSystem.out.printlnthread.sleepだけでなく、それでも動作します

これに対応するファイルは他にもたくさんありますが、それらをロードするのは面倒であり、これが人々が知っている一般的な問題であることを望んでいました。

どんな助けでも大歓迎です。

import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class ConnectedClient extends Thread
{

  private Socket cSocket;       //Client's Socket
  private PrintWriter cout;     //write to Client
  private BufferedReader cin;   //Read from Client
  private String cip;           //Clients IP

  private Socket pSocket;       //Partner's Socket
  private PrintWriter pout;     //Write to partner
  private String pip;           //Partner's ip

  private Server srvr;          //Current server

  public ConnectedClient(Socket skt, Server s)
  {
    try
    {
      //Client information
      cSocket = skt;
      cout = new PrintWriter(cSocket.getOutputStream(), true);
      cin = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
      //Partner's information
      pSocket = null;
      pip = null;
      pout = null;

      //Server and thread
      srvr = s;
      start();
    }
    catch(Exception E)
    {
      System.out.println(E);
    }
  }

  public void run()
  {
    String data;
    System.out.println("Connected to client");
    try
    {
      //Get the ip address and add it to server's table
      while(!cin.ready()){}
      cip = cin.readLine();
      srvr.addToIpTable(cip, cSocket);

      ////Waiting for another client//
      while(pSocket == null) {Thread.sleep(10);} // HEREEEEEEEEEEEEEEEEEEEEE
      System.out.println("Found a partner");
      pout = new PrintWriter(pSocket.getOutputStream(), true);
      System.out.println("I am here");
      cout.println("Done");

      while(true)
      {
        //Waits for a message
        while(!cin.ready()){}
        data = cin.readLine();

        //Outputs message to partner
        pout.println(data);
        pout.flush();
        //End when exit is typed
        if(data.equals("exit"))
          break;
      }

      //Cleanup
      cSocket.close();
      pSocket.close();
      cout.close();
      cin.close();
    }
    catch(Exception E)
    {
      System.out.println(E);
    }
  }


  public String getCip()
  {
    return cip;
  }

  public Socket getCSocket()
  {
    return cSocket;
  }

  public void setPartner(String partnerIp, Socket socket)
  {
    pip = partnerIp;
    pSocket = socket;
  }
}
4

1 に答える 1

5

pSocketを揮発性にしてみてください。ビジー待機中はキャッシュに保存され、他のスレッドが変更しても更新されません。

待機中にコアが100%使用されるのを避けるために、おそらくまだ少しのスリープが必要です。

于 2012-11-08T23:10:00.117 に答える