我正在创建一个包含服务器A和多个客户端B,C,D的程序。
B C& D将使用数字X向客户端发送消息,我想知道服务器如何使用X的最新值同时向所有客户端发送消息?
目前,它只会更新上次传递号码X的客户。
这是我运行的代码()
public void run(){
String number;
do
{
//Accept message from client on
//the socket's input stream...
received = in.readLine();
//Echo message back to client on
//the socket's output stream...
out.println("Number recieved: " + number);
}
}
答案 0 :(得分:1)
Google up JMS Publish and Subscribe。
基本上: 服务器发布到主题,客户端订阅主题。
答案 1 :(得分:1)
通知客户有关某事的最佳方法是使用JMX。如果您不应该使用此技术,那么您应该将客户列表保存在代码中的某个位置(例如在静态字段中),然后迭代此列表并发送收到的数字
答案 2 :(得分:1)
我不确定你要做什么......但你可以尝试使用套接字编程来广播消息。检查this
答案 3 :(得分:1)
您可以将所有套接字添加到集合中。将相同的消息发送到集合中的每个套接字。关闭时从集合中删除套接字。
e.g。
final List<Socket> sockets = new CopyOnWriteArrayList<Socket>();
// when you have a new socket
sockets.add(socket);
// when you have a dead socket.
sockets.remove(socket);
// to send the same message to multiple sockets.
public static void sendToAll(byte[] bytes) {
for(Socket s: sockets)
try {
s.getOutputStream().write(bytes);
} catch (IOException ioe) {
// handle exception, close the socket.
sockets.remove(s);
}
}
答案 4 :(得分:1)
我同意真正的解决方案是JMS,但如果您想“自己动手”一个简单的解决方案,我建议使用相同的JMS概念制作您自己的简化版本。创建一个将从您的客户端接收事件的类。创建客户端可以实现的接口,然后将自己添加为此新类的侦听器。一些简单的代码:
class MyEventPublisher {
Collection<EventListener> listeners;
int number;
public void addListener(EventListener listener) {
listeners.add(listener);
}
public void setNumber(int newNumber) {
int oldNumber = this.number;
this.number = newNumber;
for (EventListener listener : listeners) {
listener.numberChanged(newNumber, oldNumber);
}
}
}
interface EventListener {
void numberChanged(int newNumber, int oldNumber);
}
class MyClientSocket implements EventListener {
MyEventPublisher publisher;
public MyClientSocket(MyEventPublisher publisher) {
this.publisher = publisher;
publisher.addListener(this);
}
public recieveNumberFromSocket() {
int numberFromSocket = readNumber();
publisher.setNumber(numberFromSocket);
}
public void numberChanged(int newNumber, int oldNumber) {
//someone else changed the number
//do something interesting with it
}
}
答案 5 :(得分:1)
您正在寻找基于您的描述的多播协议
所以,我猜你会更好看这个:
Multicast (JDK 6)
Multicast (JDK 7)
从JDK 1.4.2版本开始的早期版本包括多播,但如果您使用JDK版本6或更高版本,则会更好;)