源地址链接:http://tomcat.apache.org/tomcat-6.0-doc/aio.html
Tomcat 6 AIO支持Comet的sample代码:
public class ChatServlet
extends HttpServlet implements CometProcessor {
protected ArrayList<HttpServletResponse> connections =
new ArrayList<HttpServletResponse>();
protected MessageSender messageSender = null;
public void init() throws ServletException {
messageSender = new MessageSender();
Thread messageSenderThread =
new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]");
messageSenderThread.setDaemon(true);
messageSenderThread.start();
}
public void destroy() {
connections.clear();
messageSender.stop();
messageSender = null;
}
/**
* Process the given Comet event.
*
* @param event The Comet event that will be processed
* @throws IOException
* @throws ServletException
*/
public void event(CometEvent event)
throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
if (event.getEventType() == CometEvent.EventType.BEGIN) {
log("Begin for session: " + request.getSession(true).getId());
PrintWriter writer = response.getWriter();
writer.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
writer.println("<head><title>JSP Chat</title></head><body bgcolor=\"#FFFFFF\">");
writer.flush();
synchronized(connections) {
connections.add(response);
}
} else if (event.getEventType() == CometEvent.EventType.ERROR) {
log("Error for session: " + request.getSession(true).getId());
synchronized(connections) {
connections.remove(response);
}
event.close();
} else if (event.getEventType() == CometEvent.EventType.END) {
log("End for session: " + request.getSession(true).getId());
synchronized(connections) {
connections.remove(response);
}
PrintWriter writer = response.getWriter();
writer.println("</body></html>");
event.close();
} else if (event.getEventType() == CometEvent.EventType.READ) {
InputStream is = request.getInputStream();
byte[] buf = new byte[512];
do {
int n = is.read(buf); //can throw an IOException
if (n > 0) {
log("Read " + n + " bytes: " + new String(buf, 0, n)
+ " for session: " + request.getSession(true).getId());
} else if (n < 0) {
error(event, request, response);
return;
}
} while (is.available() > 0);
}
}
public class MessageSender implements Runnable {
protected boolean running = true;
protected ArrayList<String> messages = new ArrayList<String>();
public MessageSender() {
}
public void stop() {
running = false;
}
/**
* Add message for sending.
*/
public void send(String user, String message) {
synchronized (messages) {
messages.add("[" + user + "]: " + message);
messages.notify();
}
}
public void run() {
while (running) {
if (messages.size() == 0) {
try {
synchronized (messages) {
messages.wait();
}
} catch (InterruptedException e) {
// Ignore
}
}
synchronized (connections) {
String[] pendingMessages = null;
synchronized (messages) {
pendingMessages = messages.toArray(new String[0]);
messages.clear();
}
// Send any pending message on all the open connections
for (int i = 0; i < connections.size(); i++) {
try {
PrintWriter writer = connections.get(i).getWriter();
for (int j = 0; j < pendingMessages.length; j++) {
writer.println(pendingMessages[j] + "<br>");
}
writer.flush();
} catch (IOException e) {
log("IOExeption sending message", e);
}
}
}
}
}
}
}
需要写另一个方法来调用send(),传入message,通知messageSender线程来发送消息。
分享到:
相关推荐
艾肯Aio6声卡驱动_v1.37.5是专为艾肯(URC)公司的Aio6声卡设计的一款驱动程序,版本号为1.37.5,适用于Windows全系统,包括Windows 10。这款驱动程序的核心功能在于确保声卡在各种Windows操作系统上能够正常运行,...
读书笔记:java网络编程BIONIO, AIO 源码示例
Linux内核本身也支持AIO,它提供了`io_setup`、`io_submit`、`io_getevents`等系统调用来实现异步I/O。这种方式需要更底层的编程,但可以避免glibc层的额外开销,可能更适合性能敏感的应用。虽然本压缩包未直接包含...
aio 是 JDK 7 开始支持的异步非阻塞 IO。apr 是 Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作。 三、Connector 配置 Connector 配置文件中有多个参数可以进行配置...
Linux AIO并非内核原生支持的特性,而是通过libaio库来实现的。libaio提供了一组API,让开发者可以方便地使用异步I/O。这些API包括`lio_listio`、`io_setup`、`io_submit`、`io_getevents`等,它们分别用于设置I/O上...
下面我们将深入探讨这三种I/O模型,并通过"bio nio aio demo"这个示例项目来理解它们的基础用法。 **1. BIO(阻塞I/O)** BIO是Java最早提供的I/O模型,它基于流(Stream)进行操作。在BIO模式下,每个连接都需要一个...
在这个场景中,"AIO"可能是一个缩写,代表着“Analog Input/Output”,暗示这个库支持模拟输入和输出功能。 AIO库的设计通常会包含以下关键知识点: 1. **模拟信号**:模拟信号是连续变化的电信号,与数字信号...
艾肯icon aio6声卡驱动程序是一款可以有效解决艾肯aio6声卡出现的一些问题的驱动工具,艾肯icon aio6声卡是一款支持专业录音、编曲、K歌的usb外置声卡,这是艾肯官方最新发布的艾肯aio6声卡驱动,适用于XP/Win7/Win8...
6. 设备驱动编程:展示如何编写支持AIO的设备驱动程序,与用户空间进行通信。 7. 示例和案例分析:通过实际的代码示例,展示如何在应用程序中使用AIO接口进行I/O操作。 8. 性能优化:探讨如何调整参数和配置,以获得...
例如,AIO5可能反映了2018年CISSP认证领域的重大改革,将原本的8个知识领域调整为6个新的大领域,包括安全与风险管理、资产安全、网络安全、身份与访问管理、安全工程和信息安全治理与合规性。 3. **考试大纲**:...
AIO代表“所有合一”,意味着系统具备广泛的功能,如资源管理、项目协作、数据处理、报表分析等,以支持企业的全面运营。 二、安装与配置 在开始使用前,用户需要了解安装和配置的步骤。手册将指导用户如何下载安装...
iCON艾肯aio 6 USB外置声卡驱动1.35.20版For WinXP-32/WinXP-64/Win7-32/Win7-64/Win8-32/Win8-64(2014年11月19日发布)艾肯Aio 6不但支持专业的录音、编曲这些专业的音乐工作,并且支持网络K歌,他专业的话放,...
iFRPFILE AIO v2.8.6.zip
下面是一个简单的AIO服务器端示例: ```java AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open(); serverChannel.bind(new InetSocketAddress(8080)); serverChannel....
《FRPFILE AIO v2.8.4:解锁与绕过iOS系统FRP的全方位指南》 FRPFILE AIO v2.8.4是一款针对iOS设备的免费解锁工具,全称为“Factory Reset Protection FILE All in One”。该工具旨在帮助用户解决iOS设备的Factory ...
在实际应用中,Python的`asyncio`库提供了一套完善的aio支持。它包含了`create_connection`和`start_server`等函数,可以方便地创建异步socket连接和服务器。在文件传输过程中,可以使用`asyncio.StreamReader`和`...
- **AIO(异步非阻塞I/O)**:从JDK7开始支持,是一种新的I/O模型,适用于需要处理大量并发连接的应用。 - **APR(Apache Portable Runtime)**:这是一个第三方库,使用JNI(Java Native Interface)调用本地系统...
三、操作流程示例 例如,创建新用户通常涉及以下步骤: 1. 打开AIO系统账户工具。 2. 导航到“创建用户”或“新建”选项。 3. 输入用户名,选择一个强密码,并设定密码策略。 4. 分配用户权限,如管理员、普通用户或...