package mailclass;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
/**
*
* @author AAries zyz!
*/
public class Client extends Thread {
private Selector selector;
public Client(Selector selector) {
this.selector = selector;
Thread thread = new Thread(this);
thread.start();;
}
@Override
public void run() {
try {
while (selector.select() > 0) {
// 遍历每个有可用IO操作Channel对应的SelectionKey
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey sk = (SelectionKey) it.next();
it.remove();
// 如果该SelectionKey对应的Channel中有可读的数据
if (sk.isReadable()) {
// 使用NIO读取Channel中的数据
SocketChannel socketChannel = (SocketChannel) sk.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.read(buffer);
buffer.flip();
// 将字节转化为为UTF-16的字符串
String receivedString = Charset.forName("UTF-16").newDecoder().decode(buffer).toString();
// 控制台打印出来
System.out.println("接收到来自服务器" + socketChannel.socket().getRemoteSocketAddress() + "的信息:" + receivedString);
// 为下一次读取作准备
// sk.interestOps(SelectionKey.OP_READ);//将键设为可读
}
if (sk.isWritable()) {
SocketChannel socketChannel = (SocketChannel) sk.channel();
ByteBuffer writeBuffer = ByteBuffer.wrap("我的程序员之道".getBytes("UTF-16"));
socketChannel.write(writeBuffer);
}
// 删除正在处理的SelectionKey
selector.selectedKeys().remove(sk);
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
调用类的写法
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package mailclass;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
/**
*
* @author AAries zyz!
*/
class ClientTest {
public static void main(String[] args) throws IOException {
SocketChannel sc = SocketChannel.open(new InetSocketAddress("172.16.22.11", 5200));
//打开一耳光SocketChannel并连接
sc.configureBlocking(false);
Selector selector = Selector.open();
sc.register(selector, SelectionKey.OP_READ);
//注册一个selector此时为空
Client client = new Client(selector);
//打开一个线程,如遇到可读的包则读取,如遇到可写的包,则写!
ByteBuffer writeBuffer=ByteBuffer.wrap("我的程序员之道".getBytes("UTF-16"));
sc.write(writeBuffer);
}
}
分享到:
相关推荐
`SocketSelectorServer`和`SocketSelectorClient`是源代码文件,它们展示了如何使用SocketChannel和Selector实现服务器端和客户端的通信。服务器端通常会创建一个Selector,然后注册SocketChannel,监听客户端的连接...
1. 打开`SocketChannel`:在服务器端,由`ServerSocketChannel.accept()`返回;在客户端,通过`java.nio.channels.SocketChannel.open()`获取。 2. 配置为非阻塞:`SocketChannel`默认是阻塞模式,可以调用`...
2. **ServerSocketChannel**:这个类代表了一个服务器端的套接字,用于监听客户端的连接请求。创建ServerSocketChannel后,我们需要将其绑定到特定的IP地址和端口号,然后调用`accept()`方法来接受新的连接。每个...
在本文中,我们将深入探讨如何使用 Netty 4.0.31.Final 版本构建 Android 客户端和服务器端应用程序。 首先,Netty 提供了一种简化网络编程的方式,它通过非阻塞 I/O 和 Channel 抽象来处理并发连接。在 Android 上...
Java NIO 服务器端开发详解 Java NIO 服务器端开发是 Java 语言中的一种高性能的 I/O 模式,提供了非阻塞式的 I/O 操作,能够提高服务器端的性能和可扩展性。下面是 Java NIO 服务器端开发的详细介绍: 一、NIO ...
在服务器端,Selector的应用尤为重要,因为它可以实现单线程处理多个客户端连接,从而提高系统的并发能力。 Selector的工作原理: Selector通过注册Channel(通道)到自己身上,当注册的通道上发生指定的事件时,...
ServerSocketChannel和SocketChannel是NIO包中的两个重要的Channel接口,分别用于服务器端和客户端的连接。ServerSocketChannel用于监听客户端的连接请求,而SocketChannel用于与客户端进行通信。 五、ByteBuffer...
在Java编程环境中,创建一个TCP服务器端是一项基本任务,尤其对于网络编程和分布式系统开发者而言。QuickServer是一款轻量级的Java服务器框架,它简化了TCP服务器的开发过程。本篇将详细介绍如何利用QuickServer来...
ServerSocketChannel是NIO中的服务器端通道,它可以监听客户端的连接请求。创建ServerSocketChannel并绑定到指定的端口后,通过调用`accept()`方法,非阻塞地接收新的SocketChannel连接。与传统ServerSocket不同,...
ServerSocketChannel是Java NIO中用于服务器端监听客户端连接的通道。通过调用`ServerSocketChannel.open()`方法可以创建一个ServerSocketChannel对象,然后通过`bind()`方法绑定到指定的IP和端口上。当有客户端...
3. **设置非阻塞**:为了支持并发,服务器端需要将`SocketChannel`设置为非阻塞模式。 4. **创建缓冲区**:创建`ByteBuffer`实例,用于存储接收到的数据。 5. **读取和写入**:使用`read()`方法从通道读取数据到缓冲...
2. 服务器端:服务器端通过创建`ServerSocket`实例监听特定端口,等待客户端的连接请求。一旦有客户端连接,服务器端就会创建一个Socket对象来处理这个连接。 3. 客户端:客户端通过`Socket`类创建一个Socket实例,...
NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...
本实例将深入探讨NIO在服务器端和客户端的应用,通过`NioDemoServer.java`和`NioDemoClient.java`这两个文件来解析NIO的核心知识点。 1. **NIO基础** NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...
- 客户端首先需要创建一个SocketChannel,通过`SocketChannel.open()`打开,并使用`SocketChannel.connect(SocketAddress)`连接到服务器端的地址。 - 同样,客户端也需要使用缓冲区进行数据的读写操作。 - 如果...
在"sumsever+client"这个压缩包中,你应该能找到对应的服务器端和客户端源代码文件,通过阅读和运行这些代码,你可以更深入地理解NIO在实际网络编程中的应用。 总结来说,"NIO socket编程小例子 加法服务器"是一个...
首先,让我们来看看服务器端的设计。服务器端的核心是建立一个基于NIO的服务器,它通常包含以下组件: 1. **选择器(Selector)**:选择器是NIO的核心,用于监听多个通道(Channels)上的事件,如连接请求、数据...
在这个案例中,我们将讨论如何使用Socket来实现一个简单的聊天室功能,包括服务器端和客户端的实现。 首先,我们要理解Socket的基本概念。Socket是网络通信中的一个抽象接口,可以看作是两台计算机之间的通信通道。...
在服务器端,我们需要创建一个ServerBootstrap,配置好ServerSocketChannel,并设置合适的ChannelInitializer来处理新连接。ChannelInitializer的作用是在建立连接时初始化新的Channel,添加必要的ChannelHandler。...
4. 服务器端通过选择器监控到可读事件,从SocketChannel读取缓冲区数据,解析出消息内容。 5. 如果服务器需要向客户端发送消息,过程类似,只是方向相反,服务器将消息写入缓冲区,然后通过SocketChannel的`write()`...