Java多线程服务器套接字

时间:2016-05-14 13:36:13

标签: java multithreading sockets

我有一个程序,用户可以猜出一个数字。但是当用户猜到正确的号码时,我想阻止来自所有客户端的所有消息5秒钟。

   for(ClientThread clients : clientThreads)
   {
       clients.SendGetalToServer(message);

       clients.sleep(5000);
       clients.interrupt();
   }

这适用于Thread.sleep但是在5秒之后,当我在Thread.sleep的5秒内输入时,服务器和所有客户端都收到了所有消息。

我该如何解决这个问题?

我有一个程序,用户可以猜出一个数字。但是当用户猜到正确的号码时,我想阻止来自所有客户端的所有消息5秒钟。我正在尝试使用Thread.sleep(5000)这是有效的,但在那之后的5秒内,我在Thread.sleep期间输入的所有消息都将发送给所有客户端。

下面是我的原始代码。没有Thread.sleep方法

ServerThread

public class ClientThread extends Thread {

private Socket socket;
private Server server;
private PrintWriter out;
private BufferedReader in;
private Scanner scanner;

private String username = null;
private boolean isloggedIn = false;



public ClientThread(Socket socket,Server server)
{
    this.socket = socket;
    this.server = server;


}

public Socket socket()
{
    return  socket;
}


@Override
public void run() {
    try {
        out = new PrintWriter(socket.getOutputStream());
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        scanner = new Scanner(socket.getInputStream());

        String line = "";

        out.print("Kies een username: ");
        out.flush();



        while((line = scanner.nextLine()) != null) {




                if (!isloggedIn) {
                    username = line;
                    isloggedIn = true;
                    out.println("U heeft " + username + " gekozen");
                    out.println("kies een getal");
                    out.flush();
                } else
                {


                    int g = Integer.parseInt(line);


                    if (g == server.getTeradengetal()) {

                        server.broadcastGetal(username);
                        System.out.println(line);
                        server.setTeradengetal();



                    } else if (g > server.getTeradengetal()) {
                        out.println("Lower");
                        out.flush();
                        System.out.println(line);
                    } else if (g < server.getTeradengetal()) {
                        out.println("Higher");
                        out.flush();
                        System.out.println(line);
                    }

                }

            }

        } catch (InterruptedException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }


}




public void SendGetalToServer(String message)
{
    sendMessage(message);
}

public void sendMessage(String message)
{
    out.println(message + " heeft het getal juist geraden");
    out.flush();
}

}

服务器

public class Server {

private ServerSocket serverSocket;
private Socket socket;
private List<ClientThread> clientThreads;
private int teradengetal = 10;
private boolean juistgeraden = false;


public Server() throws IOException {

    serverSocket = new ServerSocket(6000);
    clientThreads = new ArrayList<>();







    while(true)
    {

        socket = serverSocket.accept();
        System.out.println("Client connected");
        ClientThread clientThread = new ClientThread(socket,this);
        clientThread.start();
        clientThreads.add(clientThread);




    }



}

public void setTeradengetal()
{


    this.teradengetal = (int) Math.floor(Math.random() * 10);
}



public int getTeradengetal()
{
    return teradengetal;
}

public void broadcastGetal(String message) throws InterruptedException {
    for(ClientThread clients : clientThreads)
    {
            clients.SendGetalToServer(message);
    }
}

0 个答案:

没有答案