Java客户机-服务器编程:如何将消息从服务器传递到所有客户机线程?
我正在创建一个带有服务器a和多个客户端B、C、D的程序 B C&D将用数字X向所有客户端发送消息,我想知道服务器如何能够同时向所有客户端发送X的最新值 目前,它将只更新最后一次通过数字X的客户机 下面是我为run()编写的代码Java客户机-服务器编程:如何将消息从服务器传递到所有客户机线程?,java,client,distributed-computing,Java,Client,Distributed Computing,我正在创建一个带有服务器a和多个客户端B、C、D的程序 B C&D将用数字X向所有客户端发送消息,我想知道服务器如何能够同时向所有客户端发送X的最新值 目前,它将只更新最后一次通过数字X的客户机 下面是我为run()编写的代码 谷歌上JMS发布和订阅 基本上: 服务器发布到一个主题,客户端订阅一个主题。通知客户端某些事情的最佳方法是使用JMX。如果您不应该使用这种技术,那么您应该在代码中的某个位置保留客户端列表(比如在静态字段中),然后迭代该列表并发送接收号码。我不确定您要做什么……但您可以尝试
谷歌上JMS发布和订阅 基本上:
服务器发布到一个主题,客户端订阅一个主题。通知客户端某些事情的最佳方法是使用JMX。如果您不应该使用这种技术,那么您应该在代码中的某个位置保留客户端列表(比如在静态字段中),然后迭代该列表并发送接收号码。我不确定您要做什么……但您可以尝试使用套接字编程广播消息。签出您可以将所有套接字添加到集合中。向集合中的每个套接字发送相同的消息。关闭插座后,将其从集合中移除 e、 g
final List sockets=new CopyOnWriteArrayList();
//当你有一个新的插座
sockets.add(socket);
//当你有一个死插座。
插座。拆下(插座);
//将同一消息发送到多个套接字。
公共静态void sendToAll(字节[]字节){
用于(插座s:插座)
试一试{
s、 getOutputStream().write(字节);
}捕获(ioe异常ioe){
//处理异常,关闭套接字。
插座。拆除;
}
}
我同意真正的解决方案是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
}
}
类MyEventPublisher{
收集听众;
整数;
公共void addListener(EventListener listener){
添加(侦听器);
}
公共无效集合号(int newNumber){
int oldNumber=这个.number;
this.number=newNumber;
for(EventListener:侦听器){
listener.numberChanged(newNumber,oldname);
}
}
}
接口事件侦听器{
无效编号更改(整数新编号、整数旧编号);
}
类MyClientSocket实现EventListener{
MyEventPublisher出版社;
公共MyClientSocket(MyEventPublisher发布者){
this.publisher=publisher;
publisher.addListener(this);
}
公共ReceiveNumber FromSocket(){
int numberFromSocket=readNumber();
publisher.setNumber(numberFromSocket);
}
已更改公共无效编号(整数新编号、整数旧编号){
//有人换了号码
//用它做些有趣的事
}
}
根据您的描述,您正在寻找多播协议。所以,我想你最好看看这个:
从JDK版本1.4.2开始的早期版本包括多播,但如果您使用JDK版本6或更高版本,您会感觉更好;) 可能重复我对客户机-服务器编程很陌生,如何将每个单独的客户机套接字存储在一个集合中?这是在“extends Thread”类中获取套接字变量并将该值存储在集合中的简单情况吗?这种方法比使用JMX更适合我的问题。@MindDrip,我添加了一些示例。
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);
}
}
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
}
}