2015-06-05 83 views
1

我想爲兩個客戶端發送相同的對象。我使用對象寫入非共享方法並讀取非共享。類我的對象是:靜態數據成員未通過對象發送通過套接字

package servidor; 

import java.io.Serializable; 

public class Token implements Serializable { 
    private static final long serialVersionUID = -5399605122490343339L; 

    public static String sender, receiver, content; 
    String id; 

    public Token(String sender, String receiver, String content){ 
     Token.sender = sender; 
     Token.receiver = receiver; 
     Token.content = content;  

    } 

    public static Token returnToken(){ 
     Token token = new Token(Token.sender, Token.receiver, Token.content); 
     return token; 
    } 

    public static String returnSender(){ 
     return Token.sender; 
    } 

    public boolean hasToken(String id){ 
     if(Token.sender.equals(id)){ 
      return true; 
     } 
     else {return false;} 
    } 
} 

但是,當我使用的方法returnSender在客戶端,回報是null。我檢查了,我沒有錯誤收到readUnshared()的對象。我有雙方的令牌包括在服務器包中。

我有一個線程爲每個客戶端,並且線程尋找相同的對象發送。

如何在不同的線程中爲不同的客戶端發送相同的對象?

回答

2

當您序列化一個對象時,您的只有序列化該對象的字段,而不是static字段。您可以通過添加writeObject和readObject來序列化static字段,但這通常是一個非常糟糕的主意。

我建議你避免使用可變的static字段,因爲多種原因,這只是其中之一。在這種情況下,它會解決你的問題。

+0

但是,如果我的參數不是「靜態」類型,我不會在其他線程中訪問相同。我有一個主類和另外兩個類負責發送客戶端的對象。在主類中,執行我的問題的邏輯並創建對象。在另外兩個類中,對象是發送的。 – user3294746

+0

@ user3294746我想你誤會了'static'的作用。作爲http://stackoverflow.com/questions/797964/what-is-the-exact-meaning-of-static-fields-in-java解釋,「靜態」字段用於共享*的所有實例之間的字段,同班。當任何其他類引用時,您的'Token'對象始終可以訪問其字段,無論是否爲靜態。 –

+0

@ pens-fan-69,我使用靜態字段,因爲我沒有在另一個類中創建類Token的實例。例如,我的類創建我的令牌實例,我的類兩個訪問方法'returnToken()'並通過套接字發送給客戶端。問題是,當客戶端使用方法returnSender()時,方法返回null。 – user3294746