我有一个简单的程序,允许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);
}
}
}
}
答案 0 :(得分:0)
确保客户端和服务器都使用缓冲流。这是套接字连接的本质。它不会逐字节发送信息。它发送缓冲区。 你的逻辑用线操作,它等待行尾字符。它可能位于缓冲区的中间,因此您的程序将等到缓冲区已满并且可能是多行。
要消除此等待发送部分(在服务器和客户端上),应使用flush method立即发送数据。
特别是在客户端添加一行代码
while (!closed) {
os.println(s.trim());
os.flush(); // <- send immediately right now
}
如果您从服务器端发送内容,和服务器端类似。