Java onclick听众

时间:2016-04-23 09:06:14

标签: java onclick

我有一个简单的程序,允许2个客户端连接到服务器。

连接后,他们可以轮流点击空白卡片图片。

一旦2个客户中的任何一个点击空白卡片图像,卡片图像将变为Ace图像俱乐部。

更改将显示在客户端的两侧,并且将禁用两个客户端的单击。

2秒后,它会变回空白卡片图像,客户端可以再次点击。

问题

我可以在客户点击后在双方显示Ace图像俱乐部,但是当图像在2秒后变回空白卡片图像时,我再也无法点击它了。

这是我在run()方法中尝试过的(更新的)

public void run() {

    while(true) {
        try {
            while (true) {
                response = is.readLine();
                if(!response.equals("")) {
                    System.out.println(response);
                    responded = true;
                }
                break;
            }
        } catch (IOException e) {
            System.err.println("IOException:  " + e);
        }
        if(responded) {
            timer = new Timer(1000,new TimerC());
            timer.start();
            responded = false;
        }
    }
}

这是我的客户端的完整代码。请帮忙

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.Timer;

public class Client implements Runnable {

    static Socket clientSocket = null;
    ObjectInputStream in = null;
    String serverMsg;
    static PrintStream os = null;
    static DataInputStream is = null;
    static boolean closed = false;
    static String s = "";
    static String cardType = "";
    static GameUI gameUI;
    int countdown = 3;
    Timer timer = new Timer(1000,null);
    String response = null;
    boolean  responded = false;

    public static void main(String args[]) {
        try {
            clientSocket = new Socket("localhost", 5550);
            os = new PrintStream(clientSocket.getOutputStream());
            is = new DataInputStream(clientSocket.getInputStream());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        gameUI = new GameUI();

        gameUI.cardOne.addMouseListener(new MouseAdapter()  
        {  
            public void mouseClicked(MouseEvent e)  
            {  
                s = gameUI.cardOne.getText();

            }  
        }); 

        if (clientSocket != null && os != null && is != null) {
            try {
                new Thread(new Client()).start();
                while (!closed) {
                    os.println(s.trim());
                }

                os.close();
                is.close();
                clientSocket.close();
            } catch (IOException e) {
                System.err.println("IOException:  " + e);
            }
        }

    }

    public void run() {
        try {
            while (true && !responded) {
                response = is.readLine();
                if(!response.equals("")) {
                    System.out.println(response);
                    responded = true;
                    break;
                }
            }

        } catch (IOException e) {
            System.err.println("IOException:  " + e);
        }

        if(responded) {
            timer = new Timer(1000,new TimerC());
            timer.start();
            responded = false;
        }
    }

    class TimerC implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
            if(countdown == 0) { 
                timer.stop();
                gameUI.cardOne.setIcon(new ImageIcon(GameUI.revealCard("blank.png")));
                countdown = 3;
            }

            else {
                gameUI.cardOne.setIcon(new ImageIcon(GameUI.revealCard(response)));
                countdown--;
                System.out.println(countdown);

            }  
        }
    }
}

1 个答案:

答案 0 :(得分:0)

确保客户端和服务器都使用缓冲流。这是套接字连接的本质。它不会逐字节发送信息。它发送缓冲区。 你的逻辑用线操作,它等待行尾字符。它可能位于缓冲区的中间,因此您的程序将等到缓冲区已满并且可能是多行。

要消除此等待发送部分(在服务器和客户端上),应使用flush method立即发送数据。

特别是在客户端添加一行代码

 while (!closed) {
   os.println(s.trim());
   os.flush(); // <- send immediately right now
 }
如果您从服务器端发送内容,

和服务器端类似。