package com.yunta.Server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
public class ServerPC {
private Selector selector;
private ServerSocketChannel server;
private ByteBuffer buffer=ByteBuffer.allocate(1024);
private Charset charset=Charset.forName("GBK");
public ServerPC(){
try {
selector=Selector.open();
server=ServerSocketChannel.open();
server.socket().bind(new InetSocketAddress("localhost", 4444));
server.configureBlocking(false);
server.register(selector, SelectionKey.OP_ACCEPT);//注册服务器套接字通道
} catch (IOException e) {
// TODO Auto-generated catch blocks
e.printStackTrace();
}
}
public void init(){
try {
while(true){
selector.select();
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKey sk= it.next();
if(sk.isAcceptable()){//如果此通道是服务器套接字通道执行
System.out.println("test");
SocketChannel socket = server.accept();
socket.configureBlocking(false);
socket.register(selector, SelectionKey.OP_READ);
sk.interestOps(SelectionKey.OP_ACCEPT);
}
try{
if(sk.isReadable()){//如果是套接字通道
String content="";
SocketChannel channel = (SocketChannel) sk.channel();
while(channel.read(buffer)>0){
buffer.flip();
content+=charset.decode(buffer);
System.out.println("==================读取的数据是:"+content);
sk.interestOps(SelectionKey.OP_READ|SelectionKey.OP_WRITE);
}
}}catch(Exception e){
sk.cancel();
if( sk.channel()!=null){
sk.channel().close();
}
}
if(sk.isWritable()&&sk.isValid()){
SocketChannel channel = (SocketChannel) sk.channel();
String content="you success\n";
channel.write(charset.encode(content));
System.out.println("==============服务器回复的数据"+content);
sk.interestOps(SelectionKey.OP_READ);
}
}
it.remove();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}public static void main(String[] args){
new ServerPC().init();
}
}
分享到:
相关推荐
综上所述,NIO编程技术是Java中处理高性能并发I/O的重要工具,对于开发高可用、高并发的服务端应用具有重大意义。通过深入理解和熟练运用NIO,开发者能够构建出更高效、更灵活的系统。《NIO与Socket编程技术指南》_...
4. **NIO编程流程**: - 打开通道:根据需求创建FileChannel、SocketChannel或ServerSocketChannel。 - 创建缓冲区:根据需要处理的数据类型创建对应的Buffer实例。 - 读写数据:使用通道与缓冲区交互,将数据从...
**NIO编程模型** NIO(Non-blocking I/O,非阻塞I/O)是Java 1.4引入的新特性,它提供了一种不同于BIO的I/O操作方式。在NIO中,系统不再直接将数据从内核空间传输到用户空间,而是通过缓冲区(Buffer)进行数据交换...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...NIO 编程模型 - Reactor(java实现)(源码).zip
**NIO(非阻塞I/O)与Netty编程**是现代Java网络应用开发中的重要技术,它们在处理高并发、低延迟的网络通信场景中起着关键作用。本讲义详细介绍了这两种技术,旨在帮助开发者更好地理解和运用它们。 ### 一、BIO...
本实例将深入探讨NIO的基本概念、关键组件以及如何在实际编程中应用NIO。 ### 1. NIO基本概念 - **通道(Channel)**: 通道是NIO的核心概念,它类似于流,但可以双向传输数据。常见的通道类有FileChannel、...
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。 2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、...
### Java网络编程NIO视频教程知识点汇总 #### 1. Java NIO-课程简介 - **主要内容**:简述...通过以上内容的学习,开发者可以全面掌握Java NIO编程的相关技术和最佳实践,为开发高性能网络应用程序打下坚实的基础。
AIO,NIO编程视频
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
教程的目的是为程序员提供一个NIO编程的起点,帮助他们更好地理解和利用Java 1.4及更高版本中的这一强大特性。为了运行示例代码,需要安装JDK 1.4,并将其包含在系统路径中。 总的来说,NIO的引入是Java I/O领域的...
净额从原生Java的Io操作(BIO)到NIO编程,约会NIO高效并发框架——Netty,需要用到Java的基础知识(多线程,网络编程,IO,设计模式尤其是代理模式),介绍了Netty的高级架构设计和核心模块组件,Google上的...
AIO、NIO编程视频
AIO、NIO编程视频
经过我2个月的深入学习,反复修改测试,开发出一个已经能稳定使用的端口代理程序,源代码没有应用所有nio知识,但比较全面的覆盖了nio编程中需要注意的几点,如果有什么问题,可以联系我:gypzfabc@126.com
- **编程复杂性**:基于事件驱动的编程模型使得NIO编程相对复杂,容易出现各种陷阱和问题。 #### 结论 构建高性能Java NIO网络框架不仅需要对NIO的核心组件有深入的理解,还需要关注实际应用中的各种细节。通过...
6. **异常处理**:在NIO编程中,需特别关注网络中断、超时等问题,并设置合适的错误处理机制。 7. **连接管理和关闭**:NIO的SocketChannel和ServerSocketChannel都需要正确管理,包括连接建立、数据传输和连接关闭...
9. **异常处理**:在NIO编程中,正确处理各种异常(如IOException)至关重要,因为这些异常可能导致数据丢失或服务中断。 10. **工具类的封装**:文章可能介绍了一些自定义工具类,对NIO原生API进行封装,使得代码...