我正在調試通過套接字發送由XStream對象序列化的不穩定性(它是在專用線程中通過手冊創建的)。並且我添加了調試消息以從客戶端發送到服務器。Xstream沒有在線程中創建
客戶端
public class SocketClient implements Runnable {
static Socket client;
static Thread t;
static PrintWriter out;
static BufferedReader in;
static String strIn;
public static boolean CreateClientSocket(InetAddress ip) {
try {
client = new Socket();
client.connect(new InetSocketAddress(ip, 9999), 0);
t = new Thread(new SocketClient());
t.start();
return true;
} catch (UnknownHostException ex) {
Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch (IOException ex) {
Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
public static void closeClient() {
try {
client.close();
} catch (IOException ex) {
Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void sendClientPlayertoServer() {
try {
out.println("procedure start");
XStream xs =new XStream();
out.println("xs created");
GameSave gs = new GameSave();
out.println("gs created");
ArrayList<PlayerSerialize> listps = new ArrayList<PlayerSerialize>();
PlayerSerialize ps = new PlayerSerialize();
out.println("ps created");
ps.getPlayerData(Players.players.get(1));
listps.add(ps);
gs.playersSerialize = listps;
gs.gamedate = Dateutils.gamedate;
String s =xs.toXML(gs);
out.println("gs converted");
String[] ssplit = s.split("\n");
out.println("clientplayertoserver");
for (String spart : ssplit) {
out.println(spart);
}
out.println("clientready");
out.flush();
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e.toString());
Utils.debugWriteStringToFile(e.toString(), "sendclientexception");
}
}
public static void sendClientReady() {
out.println("clientready");
out.flush();
}
public static void sendClientIsAlive() {
out.println("clientisalive");
out.flush();
}
@Override
public void run() {
try {
out = new PrintWriter(client.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
while ((strIn = in.readLine()) != null) {
System.out.println(strIn);
if (strIn.contains("side")) {
strIn = in.readLine();
System.out.println(strIn);
DialogMultiplayerStart.setSide(strIn);
} else if (strIn.contains("startgame")) {
DialogMainField.startNewGame(true, false, DialogMultiplayerStart.isFirstPlayerUSSR);
DialogMultiplayerStart.callDispose();
} else if (strIn.contains("serverprestige")) {
strIn = in.readLine();
System.out.println(strIn);
Players.players.get(0).prestige = Integer.parseInt(strIn);
} else if (strIn.contains("clientplayertoclient")) {
strIn = in.readLine();
System.out.println(strIn);
XStream xs = new XStream();
GameSave gs = (GameSave) xs.fromXML(strIn);
Players.players.get(1).getPlayerSerializeData(gs.playersSerialize.get(0));
} else if (strIn.contains("refreshgamefield")) {
PanelNextTurn.refreshGameField();
}
}
} catch (IOException ex) {
Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
服務器端:
public class SocketServer implements Runnable {
static ServerSocket server;
static Socket client;
static Thread t;
static PrintWriter out;
static BufferedReader in;
static String strIn;
public static void CreateServerSocket() {
try {
server = new ServerSocket(9999);
t = new Thread(new SocketServer());
t.start();
} catch (IOException ex) {
Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void closeServer() {
try {
server.close();
} catch (IOException ex) {
Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void sendSide(String side) {
out.println("side");
out.println(side);
}
public static void sendStartGame() {
out.println("startgame");
}
public static void sendServerIsAlive() {
out.println("serverisalive");
}
public static void sendServerPrestige() {
out.println("serverprestige");
out.println(Players.players.get(0).prestige);
}
public static void sendRefreshField() {
out.println("refreshgamefield");
}
public static void sendClientPlayertoClient() {
XStream xs = new XStream();
GameSave gs = new GameSave();
ArrayList<PlayerSerialize> listps = new ArrayList<PlayerSerialize>();
PlayerSerialize ps = new PlayerSerialize();
ps.getPlayerData(Players.players.get(1));
listps.add(ps);
gs.playersSerialize = listps;
gs.gamedate = Dateutils.gamedate;
String s = xs.toXML(gs);
Utils.debugWriteStringToFile(s, "clientplayertoclient");
out.println("clientplayertoclient");
out.println(s);
}
@Override
public void run() {
try {
client = server.accept();
DialogMultiplayerStart.updateAfterConnection();
out = new PrintWriter(client.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out.println("test from server");
while ((strIn = in.readLine()) != null) {
System.out.println(strIn);
if (strIn.contains("clientplayertoserver")) {
String s=new String();
while(!(strIn=in.readLine()).contains("clientready")){
s=s+strIn;
}
XStream xs = new XStream();
GameSave gs = (GameSave) xs.fromXML(s);
Players.players.get(1).getPlayerSerializeData(gs.playersSerialize.get(0));
PanelNextTurn.setClientReady();
} else if (strIn.contains("clientisalive")) {
DialogMainField.startNewGame(true, true, DialogMultiplayerStart.isFirstPlayerUSSR);
DialogMultiplayerStart.callDispose();
}
}
out.println("CYCLE ENDED!!!");
} catch (IOException ex) {
out.println("caught error");
Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
設置側(sendSide),並開始遊戲(sendStartGame)命令的偉大工程,檢查服務器和客戶端還活着遊戲數據加載後 - 也可以正常工作。但沒有辦法發送客戶端轉向服務器。
問題是服務器端只收到「過程啓動」消息,並且沒有記錄錯誤的文件。以這種方式使用XStream是否有任何限制或問題?我應該使用什麼作爲通過套接字發送對象的不同方式?
顯示您的服務器如何讀取數據。同時顯示如何傳輸序列化數據。 – Matthias
您的請求在更新後的文章中得到解答。 – lozga
你正在使用bufferedwriter或bufferedreader?如果是,那麼你還應該在輸出流上調用'flush()'和'close()',並在輸入流上調用'flush()'。 – Matthias