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已经给出了这个答案,但显然不理解。