私はJavaでソケットゲームを使ってカードゲームを作りたいと思っています。私はこの "PlayerState"オブジェクトを持っていて、ロビーにいるかプレイする準備ができているすべてのプレイヤーを保持しています。問題は、サーバーがすべてのクライアントで同じオブジェクトを送信してもである、すべてのクライアントが不正なデータを持つ別のオブジェクトを受け取る...私はJavaソケット - 異なるオブジェクトを受け取っているクライアント
を説明しましょうこれは、オブジェクトを送信するサーバ内のメソッドです:
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) {
}
}
このオブジェクト
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"));
}
をrecieves、これは(クライアントとサーバの両方で利用可能な)オブジェクトであるCLIENT方法である
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つのクライアントを開くと1の後に1がのは、user2はuser1と、サーバからのprintlnからの出力は次のようになりUSER3言わせ
:ここ
[user1, user2, user3]
[user1, user2, user3]
[user1, user2, user3]
アップすべてが正常です。しかし、これは、クライアントが受け取るものです:
クライアント1(USER1):2(USER2)
[user1,user2]
[user1,user2]
クライアント3(ユーザー3)
[user1,user2,user3]
はなぜ
[user1]
[user1]
[user1]
クライアントクライアントはすべて同じデータを受信しませんか?あなたはmultiple-thread.likeこのでそれを同期する必要がありますのでPlayersState
サーバーがクライアントにクライアントを送信するときに 'playersState'が変更されていますか。 – dabaicai
それはどういう意味ですか? –
サーバーで複数のスレッドを使用していますか?もしそうなら、 'PlayersState'インスタンスへのアクセスをどのように同期させますか? –