【图灵干货】Java高级教程第十七节:NIO实现群聊
2021-11-25 13:30:49
实现步骤
生成Selector和一个服务端监听通道。
开始监听和处理建立连接请求。
处理读数据
集群数据实现。
客户测试执行。
服务端实现
2.0服务端完整代码。
下面是服务方面的主要功能。
1.打开监视端口,方法ChatServer构造方法。
2.处理链接请求,listener方法建立连接。
3.通过方法readData读取消息内容。
4.向当前所有联机的用户转发消息,方法sendData2All。
packagecom.hgy.chat;
/**
*群聊天服务器。
*/
发布类服务器{
privateServerSocketChannelserverSocketChannel;
私人选择器;
/**
*对服务端进行初始化。
*/
公共图片服务器(){
try{
//和ServerSocketChannel一起创建选择器。
selector=Selector.open();
serverSocketChannel=serverSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(newInetSocketAddress);
//在Selector中注册服务端监听通道。
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*监视客户端动作。
*/
publicvoidlistener(){
while(true){
try{
if(selector.select(1000)==0){
continue;
}
//获取具有事件的所有密钥。
SetselectionKeys=selector.selectedKeys();
Iteratoriterator=selectionKeys.iterator();
while(iterator.hasNext()){
SelectionKeykey=iterator.next();
//当前键是否为处理链接类型。
{if(key.isAcceptable){
SocketChannelsocketChannel=。
serverSocketChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector,SelectionKey.OP_READ);
}
//当前链接为读取数据类型。
if(key.isReadable){
readData(键);
}
iterator.remove();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*读数据,并向所有用户发送。
*@paramkey。
*/
私钥数据(SelectionKeykey){
try{
if(key.isReadable){
SocketChannelchannel=(SocketChannel)key.channel();
ByteBufferbyteBuffer=ByteBuffer.allocate(1024);
channel.read(byteBuffer);
字符串=newstring(byteBuffer.array);
//写入所有其他客户端。
sendData2All(s);
}
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*向所有用户群发。
*@parammsg需要发送的的消息。
*/
privatevoidsendData2All(Stringmsg){
try{
//所有当前注册到selector的key都是所有用户。
设置=selector.keys();
for(SelectionKeykey:keys){
//为每个用户获得通道。
SelectableChannelchannel=key.channel();
//执行数据发送。
(channelinstanceofSocketChannel){
printlnSystem.out.print("::"+msg)
ByteBufferbyteBuffer=ByteBuffer.wrap(msg.getBytes);
SocketChannel=(SocketChannel)频道;
socketChannel.write(byteBuffer);
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
ChatServerchatServer=newChatServer();
chatServer.listener();
}
}
2.1构建Selector和一个服务端监听通道。
创建ChatServer对象后,具体执行以下步骤。
1.创建一个serverSocketChannel对象。
2.将处理模式设置为非阻塞模式。
3.绑定侦听端口。
4.向selector注册channel。
发布类服务器{
privateServerSocketChannelserverSocketChannel;
私人选择器;
/**
*对服务端进行初始化。
*/
公共图片服务器(){
try{
//和ServerSocketChannel一起创建选择器。
selector=Selector.open();
serverSocketChannel=serverSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(newInetSocketAddress)(8。
图灵学院成立于2017年7月15日,现阶段提供 计算机基础原理、JavaSE核心、Java后端、 面试必备算法、python核心编程、数据分析、web 开发题、人工智能等专题课程,为想学习Python的学员提供优质的培训服务,帮助学员掌握更加全面的技能,是计算机人员职场中提职加薪的首选。
免费java架构师视频学习地址:免费视频