【问题标题】:Weird Thread occurence with ChatClient聊天客户端出现奇怪的线程
【发布时间】:2012-11-08 23:08:30
【问题描述】:

我试图让两个人连接到服务器,并且服务器在他们之间建立了连接。然后他们可以互相交谈。 如果你看到说“HEREEEEEEEEEEEEEEEEEE”的评论,我有一个thread.sleep,出于某种奇怪的原因,它与thread.sleep()一起工作,但是如果我把它拿出来,如果有的话,只有一个人可以发送给他们的伙伴是没有thread.sleep();

附:它也适用于 System.out.println,而不仅仅是 thread.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;
  }
}

【问题讨论】:

    标签: java multithreading sockets client


    【解决方案1】:

    尝试将 pSocket 设置为 volatile - 在繁忙等待期间,它将处于缓存中,并且在其他线程更改它时永远不会更新。

    您可能仍然想要一个小睡眠,以避免在等待时 100% 使用内核。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2015-07-03
      • 2016-06-18
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多