Java 通过套接字发送对象:客户端不接收对象

Java 通过套接字发送对象:客户端不接收对象,java,multithreading,sockets,Java,Multithreading,Sockets,我有一个服务器,它为许多客户服务。所有客户端都连接到服务器。服务器在不同的线程上为每个客户机提供服务,该线程将对象发送给客户机。这些线程中的每一个都使用方法returnToken(),因为这将返回在main类中创建的令牌实例。问题是,客户端接收对象(或似乎接收),但无法访问其属性。当客户端访问对象的属性时,将返回null。除此之外,不使用entrada类中的对象标记 public class ThreadServidor extends Thread implements Runnable{

我有一个服务器,它为许多客户服务。所有客户端都连接到服务器。服务器在不同的线程上为每个客户机提供服务,该线程将对象发送给客户机。这些线程中的每一个都使用方法
returnToken()
,因为这将返回在main类中创建的令牌实例。问题是,客户端接收对象(或似乎接收),但无法访问其属性。当客户端访问对象的属性时,将返回
null
。除此之外,不使用
entrada
类中的对象标记

public class ThreadServidor extends Thread implements Runnable{

    Socket cliente;

    ThreadServidor(Socket cliente){
        this.cliente = cliente;
    }

    @Override
    public void run() {
        ObjectOutputStream saida = null;
        try {
            saida = new ObjectOutputStream(cliente.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex);
        }

        while(true){
        try {
            saida.writeUnshared(Token.returnToken());
            saida.flush();
            saida.reset();

        } catch (IOException ex) {
            Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
                    Thread.sleep(15000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex);
                }

        }
    }
}
客户端中的My class entrada:

public class Entrada implements Runnable {

    private Socket servidor;
    private String id;

    Entrada(Socket cliente, String id){
        this.servidor = cliente;
        this.id = id;
    }

    @Override
    public void run() {

       ObjectInputStream entrada = null;
        try {
            entrada = new ObjectInputStream(servidor.getInputStream());
        } catch (IOException ex) {
            Logger.getLogger(Entrada.class.getName()).log(Level.SEVERE, null, ex);
        }

     // Loop principal
        while (true) {
            try {
            try {
                // Recebe mensagem do servidor
                Token token = (Token) entrada.readUnshared();
                System.out.println("Sender is "+Token.returnSender());

            } catch (IOException ex) {
                Logger.getLogger(Entrada.class.getName()).log(Level.SEVERE, null, ex);
            }
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Entrada.class.getName()).log(Level.SEVERE, null, ex);
            }        
        }
    } 
}
以及令牌类:

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

    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(){
        System.out.println("Sender is "+sender);
        return Token.sender;
    }

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

静态字段未序列化。让他们成为实例成员


您需要单独捕获
EOFEException
,捕获时停止阅读。

您已经问了这个问题(),并且已经收到了一个答案,告诉您出了什么问题。您显然不了解如何使用
静态
变量(例如,对单例类型数据的使用要谨慎)。将
Token
的静态成员作为参数传递给构造函数,仅用于设置相同的静态成员是没有意义的!如果你不理解给出的有效答案,你需要做更多的研究,而不是重新提问。很对,尽管@user3294746已经给出了这个答案,但显然不理解。