通过NIO的学习,自己简单写了一个,C/S架构的聊天工具。
Server端:
1.接受客户端Channel。
2.记录客户端集合clients。利用channel进行区分客户端,后续可以添加一个ID。
3.客户端通过遍历clients,对除发送者以外的所有客户端通讯。
Client端:
1.发送请求。
2.接收内容
3.获取控制台内容,并发送
待解决问题:
由于获取控制台数据的流,System.in是阻塞的IO:
ReadableByteChannel in=Channels.newChannel(System.in);
ByteBuffer buffer = ByteBuffer.allocate(1024);
in.read(buffer);//这里会阻塞
所以每次接收消息的话,并需控制台触发一下,不知道有没有好的方法,还请知道的大牛指导下,谢谢
以下是代码:
public class NioServer {
private static Set<SocketChannel> clients=new HashSet<SocketChannel>();
public static void main(String[] args) {
ServerSocketChannel serverChannel;
Selector selector;
try{
//服务端的准备
serverChannel= ServerSocketChannel.open();
ServerSocket serverSocket=serverChannel.socket();
serverSocket.bind(new InetSocketAddress(12345));
serverChannel.configureBlocking(false);
selector=Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch (IOException e){
e.printStackTrace();
return;
}
while(true){
try {
selector.select();
System.out.println("======select========");
} catch (IOException e) {
e.printStackTrace();
break;
}
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while(iterator.hasNext()){
SelectionKey key=iterator.next();
iterator.remove();
try {
if(key.isAcceptable()){
System.out.println("=============accept============");
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client=server.accept();//接受客户端的请求
client.configureBlocking(false);//客户端 服务端 全都设置为 非阻塞
clients.add(client);
client.register(key.selector(), SelectionKey.OP_READ);
}
if(key.isReadable()){
System.out.println("=============read==============="+clients);
SocketChannel client=(SocketChannel) key.channel();
ByteBuffer buffer=ByteBuffer.allocate(1024);
if(client.read(buffer)>0){
Iterator<SocketChannel> it=clients.iterator();
while(it.hasNext()){
SocketChannel other=it.next();
if(other != client){
buffer.flip();
other.write(buffer);
}
}
}
key.interestOps(SelectionKey.OP_READ);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private String name="A";
public void execute(){
try {
SocketChannel client = SocketChannel.open();
Selector selector = Selector.open();
client.configureBlocking(false);
client.connect(new InetSocketAddress("127.0.0.1", 12345));
//注册监听Connect
client.register(selector, SelectionKey.OP_CONNECT,name);
while(true){
int n = selector.select();
if(n==0){
continue;
}
Iterator<SelectionKey> iterator=selector.selectedKeys().iterator();
while(iterator.hasNext()){
SelectionKey key=iterator.next();
iterator.remove();
if(key.isConnectable() && client.finishConnect()){
System.out.println("[client]:连接成功");
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(name.getBytes());
buffer.flip();
client.write(buffer);
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
if(key.isReadable()){
System.out.println("[client]:开始接受");
ByteBuffer buffer = ByteBuffer.allocate(1024);
WritableByteChannel out = Channels.newChannel(System.out);
while(client.read(buffer)>0){
System.out.println("==============");
buffer.flip();
out.write(buffer);
}
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
if(key.isWritable()){
ReadableByteChannel in=Channels.newChannel(System.in);
ByteBuffer buffer = ByteBuffer.allocate(1024);
if(in.read(buffer)>0){
buffer.flip();
SocketChannel channel = (SocketChannel) key.channel();
channel.write(buffer);
buffer.clear();
}
key.interestOps(SelectionKey.OP_READ);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
分享到:
相关推荐
赠送jar包:httpcore-nio-4.4.6.jar 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar 赠送源代码:httpcore-nio-4.4.6-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.6-javadoc-API文档-中文(简体)版.zip ...
赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)版....
赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...
赠送jar包:httpcore-nio-4.4.10.jar; 赠送原API文档:httpcore-nio-4.4.10-javadoc.jar; 赠送源代码:httpcore-nio-4.4.10-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.10.pom; 包含翻译后的API文档...
赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)-...
赠送jar包:httpcore-nio-4.4.10.jar; 赠送原API文档:httpcore-nio-4.4.10-javadoc.jar; 赠送源代码:httpcore-nio-4.4.10-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.10.pom; 包含翻译后的API文档...
赠送jar包:httpcore-nio-4.4.5.jar; 赠送原API文档:httpcore-nio-4.4.5-javadoc.jar; 赠送源代码:httpcore-nio-4.4.5-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.5.pom; 包含翻译后的API文档:...
赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...
java运行依赖jar包
赠送jar包:httpcore-nio-4.4.6.jar; 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar; 赠送源代码:httpcore-nio-4.4.6-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.6.pom; 包含翻译后的API文档:...
赠送jar包:httpcore-nio-4.4.14.jar; 赠送原API文档:httpcore-nio-4.4.14-javadoc.jar; 赠送源代码:httpcore-nio-4.4.14-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.14.pom; 包含翻译后的API文档...
组成对La2NiO4+δ-La0.6Sr0.4Co0.2Fe0.8O3-δ复合阴极材料导电性能与热膨胀性能的影响,石海,常贵阳,本文选择La2NiO4+δ与La0.6Sr0.4Co0.2Fe0.8O3-δ为组元,设计并制备出(100-x)wt.%La2NiO4+δ+xwt.% La0.6Sr0.4...
赠送jar包:httpcore-nio-4.4.12.jar; 赠送原API文档:httpcore-nio-4.4.12-javadoc.jar; 赠送源代码:httpcore-nio-4.4.12-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.12.pom; 包含翻译后的API文档...
Nio学习笔记
NIO与Netty编程-课程讲义,包含 BIO、NIO、Io的介绍,NIO网络聊天的案列,自定义RPC的实现与设计
01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 ...
赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...
赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...
赠送jar包:httpcore-nio-4.4.4.jar; 赠送原API文档:httpcore-nio-4.4.4-javadoc.jar; 赠送源代码:httpcore-nio-4.4.4-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.4.pom; 包含翻译后的API文档:...
01-Java NIO-课程简介.mp4 02-Java NIO-概述.mp4 03-Java NIO-Channel-概述.mp4 04-Java NIO-Channel-FileChannel(介绍和示例).mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel...