Java 客户端服务器上的观察者链不更新根观察者

Java 客户端服务器上的观察者链不更新根观察者,java,client,server,observer-pattern,Java,Client,Server,Observer Pattern,我在客户端-服务器java程序中遇到了一些奇怪的行为,该程序使用套接字将信息从客户端发送到服务器。服务器需要实现多个客户端,因此当连接新客户端时,将运行一个新线程来处理该客户端的套接字。我遇到的问题是,观察每个套接字的观察者没有调用其update()方法,即使每次套接字接收到新数据包时都会调用它。这里有一些代码可以帮助您 ServerObserver类: package Server; import java.io.IOException; import java.util.ArrayList

我在客户端-服务器java程序中遇到了一些奇怪的行为,该程序使用套接字将信息从客户端发送到服务器。服务器需要实现多个客户端,因此当连接新客户端时,将运行一个新线程来处理该客户端的套接字。我遇到的问题是,观察每个套接字的观察者没有调用其update()方法,即使每次套接字接收到新数据包时都会调用它。这里有一些代码可以帮助您

ServerObserver类:

package Server;

import java.io.IOException;
import java.util.ArrayList;

import Packet.Packet;

public class ServerObserver {

    private Server subject;

    public ServerObserver(Server server) {
        subject = server;
        subject.attach(this);
    }

    public void update() {
        //display packet data
    }

    public static void main(String args[]) {
        Server s = null;
        try {
            s = new Server();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ServerObserver so = new ServerObserver(s);
    }

}
package Server;

import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class Server {

    private ServerObserver observer;

    static final int PORT_NUM = 1978;
    private ArrayList<SocketServer> clients;

    public Server() throws IOException {
        clients = new ArrayList<SocketServer>();
        serverLoop();
    }

    public ArrayList<SocketServer> getClients() {
        return clients;
    }

    private void serverLoop() throws IOException {
        ServerSocket ss = null;
        boolean listeningSocket = true;
        try {
            ss = new ServerSocket(PORT_NUM);
        } catch (IOException e) {
            System.err.println("Could not listen on port " + PORT_NUM);
        }

        while(listeningSocket) {
            Socket clientSocket = ss.accept();
            SocketServer s = new SocketServer(clientSocket);
            clients.add(s);
            s.attach(this);
            s.start();
        }
        ss.close();
    }

    public void attach(ServerObserver o) {
        observer = o;
    }

    private void notifyObserver() {
        System.out.println("Notifying this Server's observer");
        observer.update();
    }

    public void update() {
        System.out.println("A Socket Server has called update");
        this.notifyObserver();
    }

}
package Server;

import java.net.*;
import java.io.*;

import Packet.Packet;

public class SocketServer extends Thread {

    private Socket socket = null;
    private Server observer;
    private Packet lastPacket = null;

    public SocketServer(Socket socket) {
        super("SocketServer");
        this.socket = socket;
    }

    public Packet getLastPacket() {
        return lastPacket;
    }

    public void attach(Server observer) {
        this.observer = observer;
    }

    public void notifyObserver() {
        System.out.println("Notifying this SocketServer's Observer");
        observer.update();
    }

    public void run() {
        try {
            while(true) {
                try {
                    InputStream is = socket.getInputStream();
                    ObjectInputStream ois = new ObjectInputStream(is);
                    Packet newPacket = null;
                    newPacket = (Packet) ois.readObject();
                    if(newPacket != null) {
                        System.out.println("New packet recieved from client " + newPacket.getClientID());
                        setNewPacket(newPacket);
                        notifyObserver();
                    }
                } catch (Exception e) {
                    e.setStackTrace(getStackTrace());
                }
            }
        } catch (Exception e) {
            e.setStackTrace(getStackTrace());
        }
    }

    public void setNewPacket(Packet packet) {
        lastPacket = packet;
    }

}
服务器类:

package Server;

import java.io.IOException;
import java.util.ArrayList;

import Packet.Packet;

public class ServerObserver {

    private Server subject;

    public ServerObserver(Server server) {
        subject = server;
        subject.attach(this);
    }

    public void update() {
        //display packet data
    }

    public static void main(String args[]) {
        Server s = null;
        try {
            s = new Server();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ServerObserver so = new ServerObserver(s);
    }

}
package Server;

import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class Server {

    private ServerObserver observer;

    static final int PORT_NUM = 1978;
    private ArrayList<SocketServer> clients;

    public Server() throws IOException {
        clients = new ArrayList<SocketServer>();
        serverLoop();
    }

    public ArrayList<SocketServer> getClients() {
        return clients;
    }

    private void serverLoop() throws IOException {
        ServerSocket ss = null;
        boolean listeningSocket = true;
        try {
            ss = new ServerSocket(PORT_NUM);
        } catch (IOException e) {
            System.err.println("Could not listen on port " + PORT_NUM);
        }

        while(listeningSocket) {
            Socket clientSocket = ss.accept();
            SocketServer s = new SocketServer(clientSocket);
            clients.add(s);
            s.attach(this);
            s.start();
        }
        ss.close();
    }

    public void attach(ServerObserver o) {
        observer = o;
    }

    private void notifyObserver() {
        System.out.println("Notifying this Server's observer");
        observer.update();
    }

    public void update() {
        System.out.println("A Socket Server has called update");
        this.notifyObserver();
    }

}
package Server;

import java.net.*;
import java.io.*;

import Packet.Packet;

public class SocketServer extends Thread {

    private Socket socket = null;
    private Server observer;
    private Packet lastPacket = null;

    public SocketServer(Socket socket) {
        super("SocketServer");
        this.socket = socket;
    }

    public Packet getLastPacket() {
        return lastPacket;
    }

    public void attach(Server observer) {
        this.observer = observer;
    }

    public void notifyObserver() {
        System.out.println("Notifying this SocketServer's Observer");
        observer.update();
    }

    public void run() {
        try {
            while(true) {
                try {
                    InputStream is = socket.getInputStream();
                    ObjectInputStream ois = new ObjectInputStream(is);
                    Packet newPacket = null;
                    newPacket = (Packet) ois.readObject();
                    if(newPacket != null) {
                        System.out.println("New packet recieved from client " + newPacket.getClientID());
                        setNewPacket(newPacket);
                        notifyObserver();
                    }
                } catch (Exception e) {
                    e.setStackTrace(getStackTrace());
                }
            }
        } catch (Exception e) {
            e.setStackTrace(getStackTrace());
        }
    }

    public void setNewPacket(Packet packet) {
        lastPacket = packet;
    }

}
运行此程序时,我从服务器获得以下输出:

从客户端1234接收的新数据包 通知此SocketServer的观察者 套接字服务器已调用更新 通知此服务器的观察者

现在,在ServerObserver中的update()方法中有一些System.out.println()调用,用于打印数据包中的信息。但这些都没有展示,我也不知道为什么。
任何帮助都将不胜感激:)谢谢。

您是否多次致电
attach
?在服务器和SocketServer上调用attach将观察者附加到主题。为什么?您可能会注意到,您的服务器类一次只能附加到一个观察者。调用
attach
将停止前一个被附加的功能…哦,我知道哪里出错了,谢谢!