Client Server上的观察者链不会更新根观察者

时间:2015-03-23 22:48:24

标签: java client server observer-pattern

我在客户端服务器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();
    }

}

SocketServer类:

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的观察者 套接字服务器已调用更新 通知此服务器的观察者

现在在Server Observer中的update()方法内部,有一些System.out.println()调用打印出Packet内的信息。但这些没有显示,我不知道为什么。 任何帮助将不胜感激:)谢谢。

0 个答案:

没有答案
相关问题