DatagramChannel 是处理UDP协议
1. server
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.charset.Charset;
public class DatagramServer {
public static void main(String[] args) throws Exception {
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(1234));
ByteBuffer bf = ByteBuffer.allocate(1024);
while (true) {
System.out.println("listening ... ");
SocketAddress remoteAddress = channel.receive(bf);
new DealClientThread(channel, remoteAddress, bf);
}
}
}
class DealClientThread implements Runnable {
private DatagramChannel channel;
private SocketAddress remoteAddress;
private ByteBuffer bf;
public DealClientThread(DatagramChannel channel,
SocketAddress remoteAddress, ByteBuffer bf) {
this.channel = channel;
this.remoteAddress = remoteAddress;
this.bf = bf;
new Thread(this).start();
}
public void run() {
try {
// reveive
bf.flip();
String receivedString = Charset.forName("UTF-8").newDecoder()
.decode(bf).toString();
System.out.println("Receivet client " + remoteAddress.toString()
+ " message: " + receivedString);
// send
String sendString = "Hi, client(" + remoteAddress.toString()
+ ") I had receive your message.";
ByteBuffer bfSend = ByteBuffer.wrap(sendString.getBytes("UTF-8"));
channel.send(bfSend, remoteAddress);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
2. client
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.charset.Charset;
import java.util.Date;
public class DatagramClient {
public static void main(String[] args) throws Exception {
// send
DatagramChannel channel = DatagramChannel.open();
String sendString = "Hi, server. @" + new Date().toString();
ByteBuffer sendBuffer = ByteBuffer.wrap(sendString.getBytes("UTF-8"));
channel.send(sendBuffer, new InetSocketAddress("127.0.0.1", 1234));
System.out.println("Send message to server end");
// receive
ByteBuffer receiveBuffer = ByteBuffer.allocate(80);
SocketAddress remoteAddress = channel.receive(receiveBuffer);
receiveBuffer.flip();
String receivedString = Charset.forName("UTF-8").newDecoder()
.decode(receiveBuffer).toString();
System.out.println("Receive message from " + remoteAddress.toString()
+ " server: " + receivedString);
}
}
分享到:
相关推荐
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...
首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写操作不会被挂起,而是立即返回,这极大地提高了程序的效率。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...
在学习NIO时,首先需要理解Channel、Buffer、Selector的基本概念和使用方法,然后通过实例来熟悉它们的交互过程。例如,可以通过创建一个简单的服务器,使用ServerSocketChannel监听连接,SocketChannel处理客户端...
3. **Buffer(缓冲区)**:在NIO中,数据读写都是通过缓冲区进行的。缓冲区是一个可以容纳特定类型数据(如字节、字符、整数等)的容器,它提供了对数据的高效访问和管理。 4. **FileChannel**:用于文件的读写,...
3. 调用Selector的`select()`方法等待事件的发生。如果没有任何事件发生,则此方法会阻塞直到有事件可用。 4. 一旦有事件发生,Selector会返回就绪的Channel列表,这时可以对这些Channel进行相应的处理。 #### 四...
缓冲区是NIO中数据存储的主要方式,它们是固定大小的数组,可以用于存储各种基本类型的数据,如字符、字节、整数等。在读写操作中,数据会先被存入缓冲区,然后再从缓冲区传输,这样可以提高效率。在这个聊天室应用...
3. Stream类:包括字节流InputStream和OutputStream,以及字符流Reader和Writer,提供了基本的读取、写入功能。 4. Writer/Reader类:专门用于处理字符数据的类,它们可以用来读写字符流。 Java IO通过try-with-...
3. **选择器(Selectors)**:选择器允许单个线程监控多个通道,查看哪些通道已经准备好进行读写操作,从而提高多路复用的效率。 接下来,我们谈谈Anontion(注解)。在Java中,注解是一种元数据,可以为编译器、...
3. 非阻塞I/O:对比NIO和BIO,解释非阻塞I/O的优势,并展示如何在实际项目中应用。 4. 多路复用:详述选择器的工作原理,如何注册、选择和处理事件,以及如何优化多路复用的性能。 5. 客户端与服务器通信:介绍如何...
#### 3. Selector(选择器) - **Selector 基础**:介绍了 Selector 的基本概念及工作原理。 - **使用 SelectionKey**:解释了如何使用 SelectionKey 来管理 Channel 的选择状态。 - **使用 Selectors**:详细讨论...
以上是使用NIO实现邮件接收的基本原理和步骤,实际开发中还需要考虑性能优化、错误处理、多线程等问题。在"assignment2"这个压缩包文件中,可能包含了实现这一功能的具体代码,你可以参考学习,理解其中的逻辑和技巧...
### NIO 入门知识点详解 #### 一、NIO 的引入及其背景 - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速...
首先,理解Java NIO的基本概念非常重要。NIO中的“N”代表“非阻塞”,这意味着在进行I/O操作时,程序可以继续执行其他任务,而不是等待数据传输完成。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...
#### 三、NIO实现Socket通信的基本流程 基于Java NIO的Socket通信流程大致如下: 1. **创建ServerSocketChannel**:服务器端首先需要创建一个`ServerSocketChannel`,用于监听客户端的连接请求。 2. **创建...
《深入浅出NIO》 在Java编程领域,NIO(New Input/Output)是一种用于替代标准IO模型的机制,其核心在于非阻塞的I/O操作和通道(Channel)...通过理解NIO的基本概念和机制,我们可以构建出更高效、可扩展的应用程序。
首先,我们要理解NIO的基本理念。传统的BIO模型在进行I/O操作时,如果一个线程正在读取或写入数据,那么这个线程会一直被阻塞,直到I/O操作完成。而在NIO中,I/O操作不再阻塞线程,而是采用“选择器”(Selector)来...
一、NIO的基本概念 1. 缓冲区(Buffer):NIO的核心组件,用于存储数据。Java提供了多种Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,分别对应不同数据类型。每个Buffer都有特定的方法用于写入、读取、清理和...