package com.atguigu.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;
//服务器端
public class ChatServer {
//服务器端启动的方法
public void startServer() throws IOException {
//1 创建Selector选择器
Selector selector = Selector.open();
//2 创建ServerSocketChannel通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//3 为channel通道绑定监听端口
serverSocketChannel.bind(new InetSocketAddress(8000));
//设置非阻塞模式
serverSocketChannel.configureBlocking(false);
//4 把channel通道注册到selector选择器上
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("服务器已经启动成功了");
//5 循环,等待有新链接接入
//while(true)
for(;;) {
//获取channel数量
int readChannels = selector.select();
if(readChannels == 0) {
continue;
}
//获取可用的channel
Set<SelectionKey> selectionKeys = selector.selectedKeys();
//遍历集合
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
//移除set集合当前selectionKey
iterator.remove();
//6 根据就绪状态,调用对应方法实现具体业务操作
//6.1 如果accept状态
if(selectionKey.isAcceptable()) {
acceptOperator(serverSocketChannel,selector);
}
//6.2 如果可读状态
if(selectionKey.isReadable()) {
readOperator(selector,selectionKey);
}
}
}
}
//处理可读状态操作
private void readOperator(Selector selector, SelectionKey selectionKey) throws IOException {
//1 从SelectionKey获取到已经就绪的通道
SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
//2 创建buffer
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
//3 循环读取客户端消息
int readLength = socketChannel.read(byteBuffer);
String message = "";
if(readLength >0) {
//切换读模式
byteBuffer.flip();
//读取内容
message += Charset.forName("UTF-8").decode(byteBuffer);
}
//4 将channel再次注册到选择器上,监听可读状态
socketChannel.register(selector,SelectionKey.OP_READ);
//5 把客户端发送消息,广播到其他客户端
if(message.length()>0) {
//广播给其他客户端
System.out.println(message);
castOtherClient(message,selector,socketChannel);
}
}
//广播到其他客户端
private void castOtherClient(String message, Selector selector, SocketChannel socketChannel) throws IOException {
//1 获取所有已经接入channel
Set<SelectionKey> selectionKeySet = selector.keys();
//2 循环想所有channel广播消息
for(SelectionKey selectionKey : selectionKeySet) {
//获取每个channel
Channel tarChannel = selectionKey.channel();
//不需要给自己发送
if(tarChannel instanceof SocketChannel && tarChannel != socketChannel) {
((SocketChannel)tarChannel).write(Charset.forName("UTF-8").encode(message));
}
}
}
//处理接入状态操作
private void acceptOperator(ServerSocketChannel serverSocketChannel, Selector selector) throws IOException {
//1 接入状态,创建socketChannel
SocketChannel socketChannel = serverSocketChannel.accept();
//2 把socketChannel设置非阻塞模式
socketChannel.configureBlocking(false);
//3 把channel注册到selector选择器上,监听可读状态
socketChannel.register(selector,SelectionKey.OP_READ);
//4 客户端回复信息
socketChannel.write(Charset.forName("UTF-8")
.encode("欢迎进入聊天室,请注意隐私安全"));
}
//启动主方法
public static void main(String[] args) {
try {
new ChatServer().startServer();
} catch (IOException e) {
e.printStackTrace();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
java nio实战代码.rar (91个子文件)
代码
.idea
runConfigurations.xml 346B
misc.xml 238B
代码.iml 344B
workspace.xml 4KB
modules.xml 551B
.gitignore 184B
atguigu_nio_chat
src
com
atguigu
client
ClientThread.java 2KB
AClient.java 290B
ChatClient.java 1KB
BClient.java 290B
server
ChatServer.java 5KB
.idea
misc.xml 411B
workspace.xml 5KB
description.html 97B
encodings.xml 164B
modules.xml 279B
project-template.xml 91B
out
production
atguigu_nio_chat
com
atguigu
client
ClientThread.class 3KB
AClient.class 667B
ChatClient.class 2KB
BClient.class 667B
server
ChatServer.class 4KB
atguigu_nio_chat.iml 433B
atguigu_nio
src
com
atguigu
selector
SelectorDemo2.java 4KB
SelectorDemo1.java 2KB
filelock
FileLockDemo1.java 2KB
charset
CharsetDemo.java 2KB
pipe
PipeDemo.java 1KB
path
PathDemo1.java 728B
channel
SocketChannelDemo.java 989B
FileChannelDemo3.java 850B
FileChannelDemo2.java 892B
FileChannelDemo4.java 941B
FileChannelDemo1.java 1014B
DatagramChannelDemo.java 2KB
ServerSocketChannelDemo.java 1KB
buffer
BufferDemo1.java 2KB
BufferDemo2.java 3KB
Main.java 166B
files
FilesDemo.java 2KB
asyncfilechannel
AsyncFileChannelDemo.java 4KB
atguigu_nio.iml 2KB
.idea
misc.xml 411B
workspace.xml 7KB
description.html 97B
encodings.xml 164B
modules.xml 269B
project-template.xml 91B
out
production
atguigu_nio
com
atguigu
selector
SelectorDemo2.class 4KB
SelectorDemo1.class 2KB
filelock
FileLockDemo1.class 3KB
Main.class 379B
charset
CharsetDemo.class 3KB
pipe
PipeDemo.class 2KB
path
PathDemo1.class 1KB
channel
DatagramChannelDemo.class 3KB
FileChannelDemo4.class 1KB
FileChannelDemo1.class 2KB
FileChannelDemo2.class 1KB
ServerSocketChannelDemo.class 2KB
FileChannelDemo3.class 1KB
SocketChannelDemo.class 1KB
buffer
BufferDemo1.class 2KB
BufferDemo2.class 3KB
files
FilesDemo$1.class 2KB
FilesDemo.class 1KB
asyncfilechannel
AsyncFileChannelDemo.class 3KB
AsyncFileChannelDemo$2.class 2KB
AsyncFileChannelDemo$1.class 2KB
META-INF
atguigu_nio.kotlin_module 16B
out
production
atguigu_nio
com
atguigu
selector
SelectorDemo2.class 4KB
SelectorDemo1.class 2KB
filelock
FileLockDemo1.class 3KB
Main.class 379B
charset
CharsetDemo.class 3KB
pipe
PipeDemo.class 2KB
path
PathDemo1.class 2KB
channel
DatagramChannelDemo.class 3KB
FileChannelDemo4.class 1KB
FileChannelDemo1.class 2KB
FileChannelDemo2.class 1KB
ServerSocketChannelDemo.class 2KB
FileChannelDemo3.class 1KB
SocketChannelDemo.class 1KB
buffer
BufferDemo1.class 2KB
BufferDemo2.class 3KB
files
FilesDemo$1.class 2KB
FilesDemo.class 2KB
asyncfilechannel
AsyncFileChannelDemo.class 3KB
AsyncFileChannelDemo$2.class 2KB
AsyncFileChannelDemo$1.class 2KB
共 91 条
- 1
资源评论
码农研究僧
- 粉丝: 21w+
- 资源: 46
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功