我正在尝试编写游戏服务器,这是我第一次使用套接字。
在双方(客户端和服务器)上,我想创建两个并行线程:
1)第一个是重复(通过while-loop和Thread.sleep())向所有连接的用户发送(服务器)和读取(客户端)DefaultListModel对象。我分别为服务器和客户端使用ObjectOutputStream和ObjectInputStream。
2)第二个是String交换(用于确定调用哪个方法)。我使用BufferedReader和PrintWriter(这些线程是客户端和服务器的main()线程)。
我的问题是:所有流都搞乱了。客户端在期望String时接收DefaultModelList,反之亦然。
最后我的问题是:有没有办法将这两个过程分开?让一个流只占一个类并忽略其他类?
我的代码:
// when server wakes up
//Server:
Thread listChangesChecker = new Thread(new ListUpdater());
listChangesChecker.start();
// now client starts dialog
Client:
writer.println("old");
writer.flush();
showLoginDialog();
//Server:
String userStart = reader.readLine();
if (userStart.equals("old")) { checkOldPlayer(); }
//Client:
String password = tfPassword.getText();
writer.println(login + " " + password);
writer.flush();
//Server:
loginPassword = reader.readLine();
if(userIsOk) {
// first and last time list sends inside main()
objectWriter.writeUnshared(playersLoginList);
}
//Client:
playersList = (DefaultListModel) objectReader.readObject();
// client second thread starting
Thread t = new Thread(new ListChangeListener());
t.start();
服务器第二线程的代码:
private class ListUpdater implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
if(!objectWriters.isEmpty()) {
System.out.println("Sent new model");
for (int i = 0; i < objectWriters.size(); i++) {
ObjectOutputStream ous = objectWriters.get(i);
ous.writeUnshared(playersLoginList);
ous.reset();
}
Thread.sleep(5000);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
客户第二线程的代码
private class ListChangeListener implements Runnable {
@Override
public void run() {
try {
DefaultListModel<String> newList;
while (true) {
newList = (DefaultListModel<String>) objectReader.readUnshared();
playersList = newList;
jList.setModel(playersList);
}
} catch (Exception e) {e.printStackTrace();}
}
}