【发布时间】:2017-08-23 13:57:17
【问题描述】:
所以我想使用 Sockets 用 Java 制作一个纸牌游戏。我有这个“PlayerState”对象,它保留了所有在大厅或准备玩的玩家。问题是即使服务器为所有客户端发送相同的对象,所有客户端都会收到带有错误数据的不同对象......让我解释一下
所以这是服务器中发送对象的方法:
private void sendToAll(PlayersState playersState){
resetLists(playersState.getLobbyPlayers(),playersState.getReadyPlayer());
Iterator it = clientOutputStreams.iterator();
while (it.hasNext())
try {
ObjectOutputStream writer = (ObjectOutputStream) it.next();
writer.writeObject(playersState);
writer.flush();
System.out.println(playersState.getLobbyPlayers());
} catch (Exception ex) {
}
}
这是 CLIENT 中接收对象的方法
private void whileChatting() throws IOException {
sendMessage("&nume"+nume);
do {
try {
Object object = input.readObject();
if(object instanceof String)
showMessage("\n" + (String) object);
else if(object instanceof PlayersState){
System.out.println(((PlayersState) object).getLobbyPlayers());
PlayersState actualPlayerState = new PlayersState();
actualPlayerState.setReadyPlayer(((PlayersState) object).getReadyPlayer());
actualPlayerState.setLobbyPlayers(((PlayersState) object).getLobbyPlayers());
resetLists(actualPlayerState.getLobbyPlayers(),actualPlayerState.getReadyPlayer());
}
} catch (ClassNotFoundException var2) {
showMessage("Unknown data received!");
}
} while(!message.equals("SERVER - END"));
}
这是对象(在客户端和服务器中都可用)
package sample;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class PlayersState implements Serializable{
private static final long serialVersionUID = 7526472295622776147L;
private List<String> LobbyPlayers;
private List<String> ReadyPlayer;
public PlayersState(){
LobbyPlayers = new ArrayList<>();
ReadyPlayer = new ArrayList<>();
}
public void removeFrom(String name, List<String> list){
if(list.contains(name))
list.remove(name);
}
public void addTo(String name, List<String> list){
list.add(name);
}
public List<String> getLobbyPlayers() {
return LobbyPlayers;
}
public void setLobbyPlayers(List<String> lobbyPlayers) {
LobbyPlayers = lobbyPlayers;
}
public List<String> getReadyPlayer() {
return ReadyPlayer;
}
public void setReadyPlayer(List<String> readyPlayer) {
ReadyPlayer = readyPlayer;
}
}
如果我一个接一个地打开 3 个客户端,假设 user1 user2 和 user3 来自 SERVER 的 println 的输出将是:
[user1, user2, user3]
[user1, user2, user3]
[user1, user2, user3]
这里一切正常。但这是客户收到的:
客户端 1(用户 1):
[user1]
[user1]
[user1]
客户端 2(用户 2)
[user1,user2]
[user1,user2]
客户端 3(用户 3)
[user1,user2,user3]
为什么客户端没有收到所有相同的数据?
【问题讨论】:
-
服务器发送给客户端时
playersState是否发生变化。 -
你这是什么意思?
-
您是否在服务器中使用多个线程?如果是这样,您如何同步对
PlayersState实例的访问? -
是的,我使用多个线程,但这是我的第一个此类项目,我不知道如何同步