java nio.2群发_java 教程 | NIO实现群聊

package com.hgy.chat;

/**

* 群聊服务器

*/

public class ChatServer {

private ServerSocketChannel serverSocketChannel;

private Selector selector;

/**

* 初始化服务端

*/

public ChatServer() {

try {

// 创建Selector以及ServerSocketChannel

selector = Selector.open();

serverSocketChannel = serverSocketChannel.open();

serverSocketChannel.configureBlocking(false);

serverSocketChannel.socket().bind(new InetSocketAddress(8888));

//将服务端监听通道注册到Selector中

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 监听客户端操作

*/

public void listener() {

while (true) {

try {

if (selector.select(1000) == 0) {

continue;

}

//获得所有有事件的key

Set selectionKeys = selector.selectedKeys();

Iterator iterator = selectionKeys.iterator();

while (iterator.hasNext()) {

SelectionKey key = iterator.next();

//如果当前key是处理链接类型

if (key.isAcceptable()) {

SocketChannel socketChannel =

serverSocketChannel.accept();

socketChannel.configureBlocking(false);

socketChannel.register(selector, SelectionKey.OP_READ);

}

// 当前链接是读数据类型

if (key.isReadable()) {

readData(key);

}

iterator.remove();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 读取数据并群发给所有的用户

* @param key

*/

private void readData(SelectionKey key) {

try {

if (key.isReadable()) {

SocketChannel channel = (SocketChannel) key.channel();

ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

channel.read(byteBuffer);

String s = new String(byteBuffer.array());

// 写到其他所有客户端

sendData2All(s);

}

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 群发给所有的用户

* @param msg 需要发送的消息

*/

private void sendData2All(String msg) {

try {

// 当前在selector上注册的所有key就是所有用户

Set keys = selector.keys();

for (SelectionKey key : keys) {

// 获取每个用户的通道

SelectableChannel channel = key.channel();

// 实现数据发送

if (channel instanceof SocketChannel) {

System.out.println(":::" + msg);

ByteBuffer byteBuffer = ByteBuffer.wrap(msg.getBytes());

SocketChannel socketChannel = (SocketChannel) channel;

socketChannel.write(byteBuffer);

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

ChatServer chatServer = new ChatServer();

chatServer.listener();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值