java 套接字线程,将数据从一个套接字线程广播到java中的所有现有套接字线程

如果我正确理解您的要求,您只需要将消息从一个客户端线程传递到其他客户端线程 . 我认为你应该能够在这里使用观察者模式 .

这样的事情 - (请注意,我已从您的代码中删除了所有其他不需要显示消息广播概念的内容 . 您可能需要根据您的要求更改它) .

public class ServerStarter {

private static final ServerStarter singleton = new ServerStarter();

private volatile boolean shutdown;

// thread pool executor

private final ExecutorService executorService = Executors.newCachedThreadPool();

// observable to notify client threads

private final Observable observable = new Observable();

// fair lock (can use unfair lock if message broadcasting order is not important)

private final Lock fairLock = new ReentrantLock(true);

private ServerStarter() {

}

public static ServerStarter getInstance() {

return singleton;

}

public static void main(String args[]) {

ServerSocket server = null;

try {

//server configs,from left to right is: PORT,BackLog,Address

server = new ServerSocket();

while (!ServerStarter.getInstance().isShutdown()) {

Socket sock = server.accept();

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(sock.getInputStream()));

//each clients run on it's own thread!

SocketThread clientThread = new SocketThread(sock, inFromClient);

ServerStarter.getInstance().registerClientThread(clientThread);

ServerStarter.getInstance().startClientThread(clientThread);

}

} catch (IOException e) {

if (server != null) {

try {

server.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

e.printStackTrace();

}

}

public void shutdown() {

shutdown = true;

}

public boolean isShutdown() {

return shutdown;

}

public void startClientThread(SocketThread clientThread) {

executorService.submit(clientThread);

}

private void registerClientThread(SocketThread clientThread) {

observable.addObserver(clientThread);

}

public void notifyAllClients(final Object message) {

fairLock.lock();

try {

executorService.submit(new MessageBroadcaster(message));

} finally {

fairLock.unlock();

}

}

public void unregisterClientThread(SocketThread clientThread) {

fairLock.lock();

try {

observable.deleteObserver(clientThread);

} finally {

fairLock.unlock();

}

}

private class MessageBroadcaster implements Runnable {

private final Object message;

public MessageBroadcaster(Object message) {

this.message = message;

}

@Override

public void run() {

fairLock.lock();

try {

observable.notifyObservers(message);

} finally {

fairLock.unlock();

}

}

}

}

class SocketThread implements Runnable, Observer {

Socket clientSocket;

BufferedReader inFromClient;

public SocketThread(Socket clientSocket, BufferedReader inFromClient) {

this.clientSocket = clientSocket;

this.inFromClient = inFromClient;

}

public void run() {

try {

String fromClient;

while (!ServerStarter.getInstance().isShutdown() && (fromClient = inFromClient.readLine()) != null) {

// TODO...prepare message to broadcast

Object message = new Object();

ServerStarter.getInstance().notifyAllClients(message);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

ServerStarter.getInstance().unregisterClientThread(this);

}

}

@Override

public void update(Observable o, Object message) {

// TODO...handle the message

}

}

当客户端线程想要通知其他客户端线程时,它会异步使用observable来通知其他线程 . observable将调用每个客户端线程的 update() 方法 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值