public class ZZSocketServer extends Thread {
private final int PORT=8899;
private final int BLOCK=1024*2;
/*接受数据缓冲区*/
private ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);
/*发送数据缓冲区*/
private ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);
private Selector selector;
public ZZSocketServer(){
// 打开服务器套接字通道
ServerSocketChannel serverSocketChannel;
try {
serverSocketChannel = ServerSocketChannel.open();
// 服务器配置为非阻塞
serverSocketChannel.configureBlocking(false);
// 检索与此通道关联的服务器套接字
ServerSocket serverSocket = serverSocketChannel.socket();
// 进行服务的绑定
serverSocket.bind(new InetSocketAddress(PORT));
// 通过open()方法找到Selector
selector = Selector.open();
// 注册到selector,等待连接
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Server 8899 Port Start----"+PORT);
} catch (IOException e) {
//e.printStackTrace();
}
}
public void run(){
while(true){
try {
selector.select();
// 返回此选择器的已选择键集。
Set<SelectionKey> selectionKeys = selector.selectedKeys();
System.out.println("===selectionKeys.Size=="+selectionKeys.size());
// 接受请求
ServerSocketChannel server = null;
SocketChannel client = null;
for (SelectionKey selectionKey : selectionKeys) {
if (selectionKey.isAcceptable()) {
// 返回为之创建此键的通道。
server = (ServerSocketChannel) selectionKey.channel();
// 接受到此通道套接字的连接。
// 此方法返回的套接字通道(如果有)将处于阻塞模式。
client = server.accept();
// 配置为非阻塞
client.configureBlocking(false);
// 注册到selector,等待连接
client.register(selector, SelectionKey.OP_READ);
}
else if (selectionKey.isReadable()){
handleKey(selectionKey);
}
}
/*Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
//iterator.remove();
handleKey(selectionKey);
}*/
selectionKeys.clear();
} catch (IOException e) {
//e.printStackTrace();
}
}
}
public void handleKey(SelectionKey selectionKey)throws IOException{
System.out.println("=========handle=========");
// 接受请求
ServerSocketChannel server = null;
SocketChannel client = null;
String receiveText;
String sendText;
int count=0;
// 测试此键的通道是否已准备好接受新的套接字连接。
/*if (selectionKey.isAcceptable()) {
// 返回为之创建此键的通道。
server = (ServerSocketChannel) selectionKey.channel();
// 接受到此通道套接字的连接。
// 此方法返回的套接字通道(如果有)将处于阻塞模式。
client = server.accept();
// 配置为非阻塞
client.configureBlocking(false);
// 注册到selector,等待连接
client.register(selector, SelectionKey.OP_READ);
} else */
if (selectionKey.isReadable()) {
// 返回为之创建此键的通道。
client = (SocketChannel) selectionKey.channel();
//将缓冲区清空以备下次读取
receivebuffer.clear();
//读取服务器发送来的数据到缓冲区中
count = client.read(receivebuffer);
if (count > 0) {
receiveText = new String( receivebuffer.array(),0,count);
System.out.println("服务器端接受客户端数据--:"+receiveText.trim());
Client.list.add(selectionKey);
//将缓冲区清空以备下次写入
sendbuffer.clear();
// 返回为之创建此键的通道。
client = (SocketChannel) selectionKey.channel();
String res="abc";
sendbuffer.allocate(res.length());
//向缓冲区中输入数据
sendbuffer.put(res.getBytes());
//将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中 读取数据发向服务器,就要复位
sendbuffer.flip();
//输出到通道
client.write(sendbuffer);
System.out.println("服务器端向客户端发送数据--:"+res);
//client.register(selector, SelectionKey.OP_WRITE);
}
} else if (selectionKey.isWritable()) {
System.out.println("==========writable=====");
//将缓冲区清空以备下次写入
sendbuffer.clear();
// 返回为之创建此键的通道。
client = (SocketChannel) selectionKey.channel();
String res="abc";
sendbuffer.allocate(res.length());
//向缓冲区中输入数据
sendbuffer.put(res.getBytes());
//将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中读取数据发向服务器,就要复位
sendbuffer.flip();
//输出到通道
client.write(sendbuffer);
System.out.println("服务器端向客户端发送数据--:"+res);
//client.register(selector, SelectionKey.OP_READ);
}
}
}
分享到:
相关推荐
综上所述,基于Netty编写的socket服务端利用了Java的NIO特性,通过事件驱动和处理器链的方式,实现了高效的网络通信。开发者可以根据需求定制自己的业务处理器,处理各种复杂的网络协议,实现高性能的网络服务。在...
**Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...
通过NIOSocket工具,开发者能模拟大量并发连接,测试服务器在高负载下的表现。 该工具提供了服务端和客户端连接测试功能,包括单条发送、循环发送以及模拟多客户端发送,这些功能覆盖了网络通信的多种场景。单条...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
Socket服务端和客户端文件批量传输源码是一种基于TCP/IP协议的网络编程技术,它允许两台计算机通过网络进行数据交换,实现文件的批量传输。在Java等编程语言中,Socket通常被用来创建自定义的通信协议,是进行网络...
在NIO中,Socket通信不再局限于传统的`java.net.Socket`和`java.net.ServerSocket`,而是通过`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`进行。 1. **SocketChannel**:这是NIO中...
本示例将详细解析如何使用Java的非阻塞I/O(NIO)实现Socket通信,包括客户端发送消息和服务器端接收消息的过程。 首先,理解NIO(Non-blocking Input/Output)的概念至关重要。NIO与传统的IO模型不同,它提供了对...
在本主题中,我们将深入探讨"socket服务端客户端"的相关知识点,特别是在高效率通信和网络游戏开发中的应用。 首先,Socket是网络通信的一种接口,它允许两个或多个运行在网络上的程序通过网络进行数据交换。在TCP/...
总的来说,`NIO`在`Socket`消息推送中的应用能够显著提高服务端的并发处理能力,尤其适用于大规模的实时消息推送场景。结合`SpringBoot`的便捷性,可以快速构建出高效、稳定的消息推送服务。然而,`NIO`的学习曲线较...
以下将详细讲解如何实现Spring Boot整合Netty的Socket服务端和客户端。 首先,我们来看服务端的实现。在`netty_server`项目中,我们需要创建一个`ServerBootstrap`实例,它是Netty服务器的核心。通过`...
Java Socket 开发高并发小型服务器涉及的核心概念是网络编程中的Socket技术,以及如何利用Java语言构建能够处理大量并发连接的服务端。首先,Socket是网络通信中的一个基础概念,它为两台计算机之间的通信提供了接口...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
Java NIO(New IO)是Java 5及更高版本中引入的一个重要特性,它提供了与标准的Java IO API不同的I/O工作方式。NIO代表非阻塞I/O,它的核心特点是能够实现多路复用,使得一个单线程可以同时处理多个连接,极大地提高...
利用socketNIO实现的多客户端聊天室,非阻塞式IO,java代码编写,使用方法:先启动服务端代码再启动客户端代码,可启动多个客户端代码。若使用多个电脑启动客户端,需在客户端代码中更改一下ip地址。
【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...
本篇将基于给定的标题“采用NIO实现一个Socket服务器”来详细阐述如何使用NIO进行Socket服务端的开发。 首先,理解NIO的核心概念: 1. **通道(Channel)**:通道是连接到I/O设备的途径,可以读取或写入数据。常见的...
java版socket NIO实现,包含客户端和服务端
总之,JAVA NIO异步通信模板服务端是利用Java NIO库实现的高效并发服务,通过非阻塞I/O和选择器机制,可以轻松处理大量并发连接,同时保持较低的资源消耗。在实际开发中,这样的模板可以作为基础,根据具体需求进行...
在这个“基于java NIO的socket通信demo”中,我们将探讨如何使用NIO进行服务器和客户端的Socket通信,并解决通信过程中的字符集乱码问题。 首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端...
在这个"java socket 客户端和服务端例子"中,我们有两个主要组件:服务端(server)和客户端(client),以及可能的服务类(service)用于处理特定的业务逻辑。 首先,让我们详细了解一下Java Socket的工作原理。在...