2014-01-12 46 views
0

我正在調試通過套接字發送由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是否有任何限制或問題?我應該使用什麼作爲通過套接字發送對象的不同方式?

+0

顯示您的服務器如何讀取數據。同時顯示如何傳輸序列化數據。 – Matthias

+0

您的請求在更新後的文章中得到解答。 – lozga

+0

你正在使用bufferedwriter或bufferedreader?如果是,那麼你還應該在輸出流上調用'flush()'和'close()',並在輸入流上調用'flush()'。 – Matthias

回答

0

代碼中的問題與XStream無關,而與您如何在客戶端和服務器之間編寫數據有關。

我創建了一個小樣本供您運行。它主要使用您的服務器代碼和客戶端代碼。 我猜你已經完成了一些實現,並添加了刷新和關閉流/套接字的代碼。

運行代碼並查看數據如何從客戶端傳輸到服務器。應該足以讓你從你被困的地方開始。

下面是代碼:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import com.thoughtworks.xstream.XStream; 

public class ClientServerDemo { 

    public static void main(String[] args) { 
     Thread server = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        new Server(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     server.start(); 
     Client.sendClientPlayertoServer(); 
    } 

    static class PlayerData { 

     private List<Player> listps; 
     private Date gameDate; 

     public PlayerData(List<Player> listps) { 
      this.gameDate = new Date(); 
      this.listps = listps; 
     } 

     public String toString() { 
      String state = "Game from " + gameDate + " " + listps.size() 
        + " Players.\n"; 
      for (Player p : listps) { 
       state += p.toString(); 
      } 
      return state; 
     } 

    } 

    static class Player { 
     private String name; 

     public Player(String name) { 
      this.name = name; 
     } 

     public String toString() { 
      return "Player " + name + "\n"; 
     } 
    } 

    static class Server { 
     Server() throws IOException { 
      ServerSocket serverSocket = new ServerSocket(1234); 
      Socket s; 
      while ((s = serverSocket.accept()) != null) { 
       readFromClient(s); 
      } 
     } 

     private void readFromClient(Socket sock) throws IOException { 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        sock.getInputStream())); 
      String strIn; 
      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(); 
        PlayerData gs = (PlayerData) xs.fromXML(s); 
        System.out.println("***Server received playerData:\n" + gs); 
       } 
      } 
     } 
    } 

    public static class Client { 
     public static void sendClientPlayertoServer() { 
      try { 
       Socket socket = new Socket("localhost", 1234); 
       PrintWriter out = new PrintWriter(new OutputStreamWriter(
         socket.getOutputStream())); 
       out.println("procedure start"); 
       XStream xs = new XStream(); 
       out.println("xs created"); 
       out.println("gs created"); 
       List<Player> listps = new ArrayList<Player>(); 
       Player ps = new Player("Someone"); 
       out.println("ps created"); 
       listps.add(ps); 
       PlayerData gs = new PlayerData(listps); 

       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(); 
       out.close(); 
       socket.close(); 

       System.out.println("+++ Client send this object:\n" + gs); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

這裏是這個例子的輸出:

procedure start 
xs created 
gs created 
ps created 
gs converted 
clientplayertoserver 
+++ Client send this object: 
Game from Mon Jan 13 19:44:06 CET 2014 1 Players. 
Player Someone 

***Server received playerData: 
Game from Mon Jan 13 19:44:06 CET 2014 1 Players. 
Player Someone 

輸出主要是從您的代碼。該程序不會終止,因爲ServerSocket將繼續監聽更多的客戶端,異常處理也會丟失。 但是,這應該足以讓你開始。

+0

請檢查問題更新 - 我已添加刷新(仍然沒有影響:(),並複製完整的客戶端/服務器代碼。 – lozga