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