一、回传协议接口和UDP方式实现:
1.接口:
import java.nio.channels.SelectionKey; import java.io.IOException; public interface EchoProtocol { void handleAccept(SelectionKey key) throws IOException; void handleRead(SelectionKey key) throws IOException; void handleWrite(SelectionKey key) throws IOException; }
2.实现:
import java.net.SocketAddress; import java.nio.channels.*; import java.nio.ByteBuffer; import java.io.IOException; public class UDPEchoSelectorProtocol implements EchoProtocol { private static final int ECHOMAX = 255; // Maximum size of echo datagram static class ClientRecord { public SocketAddress clientAddress; public ByteBuffer buffer = ByteBuffer.allocate(ECHOMAX); } public void handleAccept(SelectionKey key) throws IOException { } public void handleRead(SelectionKey key) throws IOException { DatagramChannel channel = (DatagramChannel) key.channel(); ClientRecord clntRec = (ClientRecord) key.attachment(); clntRec.buffer.clear(); // Prepare buffer for receiving clntRec.clientAddress = channel.receive(clntRec.buffer); if (clntRec.clientAddress != null) { // Did we receive something? // Register write with the selector key.interestOps(SelectionKey.OP_WRITE); } } public void handleWrite(SelectionKey key) throws IOException { DatagramChannel channel = (DatagramChannel) key.channel(); ClientRecord clntRec = (ClientRecord) key.attachment(); clntRec.buffer.flip(); // Prepare buffer for sending int bytesSent = channel.send(clntRec.buffer, clntRec.clientAddress); if (bytesSent != 0) { // Buffer completely written? // No longer interested in writes key.interestOps(SelectionKey.OP_READ); } } }
二、NIO UDP客户端:
import java.net.InetSocketAddress; import java.net.SocketException; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; public class UDPEchoClientNonblocking { private static final int TIMEOUT = 3000; // Resend timeout (milliseconds) private static final int MAXTRIES = 255; // Maximum retransmissions public static void main(String args[]) throws Exception { // Convert input String to bytes using the default charset byte[] bytesToSend = "0123456789abcdefghijklmnopqrstuvwxyz".getBytes(); // Create channel and set to nonblocking DatagramChannel datagramChannel = DatagramChannel.open(); datagramChannel.configureBlocking(false); datagramChannel.socket().setSoTimeout(TIMEOUT); ByteBuffer writeBuf = ByteBuffer.wrap(bytesToSend); ByteBuffer readBuf = ByteBuffer.allocate(MAXTRIES); datagramChannel = datagramChannel.connect(new InetSocketAddress("127.0.0.1", 5500)); int totalBytesRcvd = 0; // Total bytes received so far int bytesRcvd; // Bytes received in last read while (totalBytesRcvd < bytesToSend.length) { if (writeBuf.hasRemaining()) { datagramChannel.write(writeBuf); } if ((bytesRcvd = datagramChannel.read(readBuf)) == -1) { throw new SocketException("Connection closed prematurely"); } totalBytesRcvd += bytesRcvd; System.out.print("."); // Do something else } System.out.println("Received: " + new String(readBuf.array(), 0, totalBytesRcvd)); datagramChannel.close(); } }
三、NIO UDP服务端:
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.*; import java.util.Iterator; public class UDPEchoServerSelector { private static final int TIMEOUT = 3000; // Wait timeout (milliseconds) public static void main(String[] args) throws IOException { // Create a selector to multiplex client connections. Selector selector = Selector.open(); DatagramChannel channel = DatagramChannel.open(); channel.configureBlocking(false); channel.socket().bind(new InetSocketAddress(5500)); channel.register(selector, SelectionKey.OP_READ, new UDPEchoSelectorProtocol.ClientRecord()); UDPEchoSelectorProtocol echoSelectorProtocol = new UDPEchoSelectorProtocol(); while (true) { // Run forever, receiving and echoing datagrams // Wait for task or until timeout expires if (selector.select(TIMEOUT) == 0) { System.out.print("."); continue; } // Get iterator on set of keys with I/O to process Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator(); while (keyIter.hasNext()) { SelectionKey key = keyIter.next(); // Key is bit mask // Client socket channel has pending data? if (key.isReadable()) echoSelectorProtocol.handleRead(key); // Client socket channel is available for writing and // key is valid (i.e., channel not closed). if (key.isValid() && key.isWritable()) echoSelectorProtocol.handleWrite(key); keyIter.remove(); } } } }
参考:
相关推荐
Java学习笔记是初学者探索Java编程世界的宝贵资源。这份由老师精心整理的课程笔记涵盖了Java的基础到进阶知识,旨在帮助新手快速理解并掌握这门强大的面向对象编程语言。笔记内容可能包括但不限于以下方面: 一、...
以上只是Java学习笔记中可能涉及的部分知识点,实际上,完整的笔记还会包含更深入的Java特性,如注解、模块系统、JDBC数据库访问、Spring框架等内容,以及实际项目开发中的最佳实践。这份笔记是初级Java程序员系统...
Java学习笔记之大鹏JAVA终级总结,是针对Java编程语言深入学习和面试准备的一份综合资料。这份总结涵盖了从基础知识到高级概念的多个方面,旨在帮助初学者理解和掌握Java的核心概念,同时解决面试中可能出现的关键...
11. **Java IO/NIO**:深入理解流的分类,学习非阻塞I/O模型NIO(New Input/Output)。 12. **Java 8及更高版本新特性**:包括Lambda表达式、Stream API、Optional类、日期时间API的改进等。 这些笔记内容全面覆盖...
Java公司培训经典学习笔记是针对Java编程语言进行深入学习的一份宝贵资料,涵盖了从基础到高级的诸多知识点,旨在帮助开发者提升技能,适应企业级项目开发的需求。以下将详细阐述这些笔记中的关键点: 1. **Java...
Java提供了丰富的API用于网络通信,如Socket和ServerSocket类用于TCP连接,DatagramSocket和DatagramPacket类用于UDP通信。 十、Java Swing和JavaFX(GUI编程) Swing是Java AWT(Abstract Window Toolkit)的扩展...
"狂神说Java学习笔记"提供了深入理解和实践网络编程的宝贵资源。本笔记主要涵盖了以下几个关键知识点: 1. **Java网络编程基础**:Java通过Socket API提供了网络通信的能力。Socket代表了网络上的两个应用程序之间...
- Socket编程:TCP和UDP协议,理解Socket类和ServerSocket类在客户端和服务器端的应用。 - URL与HTTP:如何使用URL和URLConnection类进行HTTP请求。 - NIO(非阻塞I/O):Java提供的高效I/O模型,用于提高网络...
8. **网络编程**:学习Java的Socket编程,包括TCP和UDP通信,以及ServerSocket和Socket类的使用。 9. **Swing GUI**:JDK6对Swing组件进行了优化,可以创建丰富的图形用户界面。学习JFrame、JButton、JLabel、...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、...以上知识点构成了Java编程的核心部分,通过深入学习和实践,你可以逐步掌握企业级Java开发所需技能。这份“Java随堂笔记”正是你踏上这一旅程的重要参考资料。
【Java学习笔记详解】 在Java的学习旅程中,基础至关重要。这份“学习笔记 十分有用 java”涵盖了J2SE(Java Standard Edition)的基础知识,旨在帮助读者深入理解这门广泛使用的编程语言。J2SE是Java的核心部分,...
在这个阶段的学习中,尚硅谷提供了2023年的学习笔记和面试题,帮助你提升Java技能并为求职做好准备。 首先,多线程是Java的一个关键特性,允许程序同时执行多个任务。理解线程的创建(通过Thread类或实现Runnable...
本资料包含学习笔记和答案,便于自我检验和理解。 1. **Java基础知识**: - **内存管理**:包括垃圾回收机制、内存泄漏及其检测方法、JVM内存模型(堆、栈、方法区等)。 - **数据类型与数据结构**:深入理解原始...
这份"java整个学习笔记带图片实现思路等"的学习资料显然涵盖了Java的基础到高级知识,包括但不限于语法、数据类型、控制结构、类与对象、异常处理、集合框架、多线程、网络编程以及IO流等内容。 首先,基础部分会...
《郑志远的Java学习笔记》是一份详细记录了作者郑志远在深入学习Java编程过程中积累的知识点和实践经验的文档。这份笔记以其系统性、实用性以及深入浅出的讲解方式,成为了Java初学者和进阶者的重要参考资料。以下是...
这份笔记集合了他在教学和实践中积累的丰富经验,旨在帮助学习者掌握Java的核心概念、设计模式以及实战技巧。通过这份笔记,读者可以系统地学习Java语言,并逐步提升为一名熟练的Java开发者。 笔记内容涵盖了以下几...
【Java学习笔记与JDK6】是针对初学者和进阶者的重要资源,由知名IT作者单兴华编写的“王者归来之良葛格”系列教程。本压缩包包含丰富的Java编程教学材料,旨在帮助用户深入理解JDK6版本中的核心概念和技术。以下是...
这份“Java学习笔记”是为初学者准备的宝贵资源,它详细记录了学习Java过程中的重要概念和知识点。 首先,Java的基础知识是学习的起点。这包括了解Java的历史背景、JVM(Java虚拟机)的工作原理以及如何安装Java...
Java学习笔记第四部分主要涵盖了Java编程语言的深入学习内容,可能是继基础语法、面向对象编程之后的高级主题。"良葛格"作为编著者,可能以易懂且实用的方式阐述了这些概念。以下是根据标题和描述可能包含的知识点:...
这份"Java学习笔记"无疑是初学者入门和提升技能的理想资源。本文将深入解析Java学习的关键知识点,帮助你逐步掌握这一强大工具。 一、Java基础知识 Java的学习始于基础,包括语法结构、数据类型、变量、运算符、...