我在客户端服务器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内的信息。但这些没有显示,我不知道为什么。 任何帮助将不胜感激:)谢谢。