0 0

java nio 服务器无限读3

下弟我这个星期编写一个 java  nio 的服务器,用于接受硬件的socket请求.
当时 注册过一个 读后,客户端发送一条信息,服务器就无限读。看下面代码

package com.nelab.socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import com.nelab.socket.reader.Reader;

public class NIOServer implements Runnable {

	private ServerSocketChannel sschannel;

	private static Selector selector;
	
	

	public NIOServer(int port) throws IOException {
		selector = Selector.open();
		sschannel = ServerSocketChannel.open();
		sschannel.configureBlocking(false);
		sschannel.socket().bind(new InetSocketAddress(port));
		sschannel.register(selector, SelectionKey.OP_ACCEPT);
		Notifier.getNotifier();
	}

	@Override
	public void run() {
		System.out.println("server start .... ");
		int num = 0;
		Iterator<SelectionKey> it  ;
		while (true) {
			try {
			num = selector.select();
			if (num > 0) {

			it = set.iterator();
	
			while (it.hasNext()) {
			SelectionKey key = it.next();
			it.remove();
			if (key.isAcceptable()) {
                                            	 ServerSocketChannel ssc = (ServerSocketChannel) key.channel();SocketChannel sc = ssc.accept();			sc.configureBlocking(false);				sc.register(selector, SelectionKey.OP_READ);				System.out.println("accept");
			} else if (key.isReadable() ) {
				
		SocketChannel channel = (SocketChannel) key.channel();
			/*  这里进行无限读*/
		System.out.println(Reader.readerUTF(channel));
						}else if(key.isWritable()){
							
						}
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	public static void main(String[] args) throws IOException {
		new Thread(new NIOServer(9001)).start();

	}
}

 

 

 请哪位高手相救啊!

项目工期紧啊


问题补充:上面的代码不够详细。我贴个详细点的 <br />public void run() { <br />&nbsp; int num = 0; <br />&nbsp; Iterator&lt;SelectionKey&gt; it&nbsp; ; <br />&nbsp; while (true) { <br />&nbsp;&nbsp; try { <br />&nbsp;&nbsp;&nbsp;&nbsp; it = set.iterator(); <br />&nbsp;&nbsp;&nbsp;&nbsp; while (it.hasNext()) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectionKey key = it.next(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it.remove(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isAcceptable()) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketChannel sc = ssc.accept(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sc.configureBlocking(false); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sc.register(selector, SelectionKey.OP_READ); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("accept"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (key.isReadable() ) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketChannel channel = (SocketChannel) key.channel(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; 这里启动线程池去读数据,但是只有channel.read 方法被调用后,key才失效 */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(key.isWritable()){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 这里启动线程池去写数据,但是只有key被注册过去写后,key才失效*/ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp; } catch (IOException e) { <br />&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />&nbsp;&nbsp; } <br />&nbsp; } <br /> } <br />在我写注释,启动线程的地方,因为其他线程抢不到运行,key不能失效,所以主线程无限 <br />可读或可写,有什么好的解决方法吗?
2010年8月11日 19:58

1个答案 按时间排序 按投票排序

0 0

在run方法里面的while(true)死循环里面做些判断,你看看你的那些判断对不对,试着调试的看怎么执行的。

2010年8月11日 22:19

相关推荐

    java NIO实例

    `NIOServer.java`和`NIOClient.java`这两个文件很可能是用于演示Java NIO服务器端和客户端的基本操作。下面将详细介绍Java NIO的主要组件和工作原理,并结合这两个文件名推测它们可能包含的内容。 1. **Selector...

    java nio聊天室源码

    4. **选择器使用**:服务器端可能会使用Selector来监听多个客户端的SocketChannel,当有数据可读或可写时,选择器会唤醒服务器进行处理。 5. **事件循环(Event Loop)**:服务器会有一个无限循环,不断调用...

    JAVA NIO 异步通信模板服务端

    本模板服务端就是基于JAVA NIO实现的异步通信机制,它能够高效地处理多个客户端连接,并且通过非阻塞I/O模式提高服务器的性能。 ### NIO核心组件 1. **Channel(通道)**:与传统I/O中的流不同,NIO中的Channel是...

    Java NIO的介绍及工作原理

    - **定义**:Selector是Java NIO中的关键组件之一,它允许单个线程同时监控多个Channel的状态,如是否可读或可写。 - **作用**:Selector的主要功能是监听多个Channel的状态变化,并通知程序哪些Channel已准备好...

    使用Java_NIO编写高性能的服务器.doc

    ### 使用Java NIO编写高性能服务器的关键知识点 #### 一、NIO概述 - **NIO简介**:NIO(New IO)自JDK 1.4引入以来,为Java提供了非阻塞IO的支持,这对于提高服务端应用的性能至关重要。NIO的核心特性包括缓冲区...

    java nio Selector的使用-服务器端

    Selector是Java NIO中的核心组件,用于监听多个通道的事件,如连接建立、数据可读、写空等。在服务器端,Selector的应用尤为重要,因为它可以实现单线程处理多个客户端连接,从而提高系统的并发能力。 Selector的...

    NIO原生API示例

    本文将深入探讨NIO原生API的示例,基于提供的"ServerImpCopy.java"文件名,我们可以推测这是一个关于服务器端NIO实现的示例代码。 在Java NIO中,核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...

    采用NIO实现一个Socket服务器

    在Java编程领域,NIO(New IO)是Java 1.4版本引入的一个新特性,全称为Non-blocking Input/Output,即非阻塞I/O。它与传统的BIO(Blocking IO)模型不同,NIO提供了更高效的数据读写方式,特别适合于高并发、低延迟...

    使用多线程的NIO构建简易的多线程java服务器

    在Java编程中,使用非阻塞I/O(Non-blocking Input/Output,NIO)和多线程技术可以构建高效、可扩展的服务器。本篇我们将深入探讨如何利用NIO和多线程来创建一个简单的Java服务器。首先,我们需要理解NIO的基本概念...

    基于NIO的Java聊天室2

    在本项目"基于NIO的Java聊天室2"中,我们深入探讨了如何利用Java的非阻塞I/O(New Input/Output,NIO)框架来实现一个多人在线聊天室。NIO是一种高效的I/O模型,它允许程序在不阻塞主线程的情况下处理输入和输出操作...

    基于Java的NIO网络框架 xSocket.zip

    总的来说,xSocket是一个基于Java NIO设计的高效网络框架,适用于开发高并发、低延迟的网络应用,如聊天服务器、游戏服务器等。通过理解NIO的基本概念和xSocket的架构,开发者可以轻松构建高性能的网络服务。

    bio nio aio demo

    NIO服务器则会使用Selector和SocketChannel,注册读事件,并在选择器返回可读事件时处理数据。AIO服务器会使用AsynchronousServerSocketChannel注册接受连接的完成处理器,并在连接建立后,处理客户端的读写请求。 ...

    NIO的工作方式

    以下是一个简化版的NIO服务器端处理流程: 1. 创建ByteBuffer,作为数据交换的缓冲区。 2. 打开并配置Selector,用于监听多个通道的事件。 3. 打开ServerSocketChannel,并设置为非阻塞模式,绑定到指定端口。 4. ...

    nio操作demo

    本示例代码主要展示了如何使用Java NIO(Non-blocking I/O)技术实现一个简单的数据服务器。该服务器通过多个`SelectorLoop`实例处理客户端连接请求,并利用`ServerSocketChannel`监听指定端口上的新连接。 #### 二...

    nio异步长连接服务端与客户端

    Java NIO(非阻塞I/O)是一种在Java中实现高效I/O操作的方式,相比于传统的BIO(阻塞I/O),NIO提供了更强大的数据传输能力,尤其适用于高并发、低延迟的网络应用,如服务器长连接场景。在这个主题中,我们将深入...

    Java Socket实例(服务器多线程)

    - 异步非阻塞I/O(如NIO,Java的`java.nio` 包)可以进一步提高服务器处理能力。 7. **异常处理**: - 网络编程中,异常处理至关重要,应妥善处理`IOException`。 - 关闭资源(如`Socket` 和流)时,确保使用`...

    NIO 经典实例

    本实例将深入探讨NIO在服务器端和客户端的应用,通过`NioDemoServer.java`和`NioDemoClient.java`这两个文件来解析NIO的核心知识点。 1. **NIO基础** NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...

    基于Java的ftp简易服务器.zip

    此外,可能还会涉及`java.nio`(非阻塞I/O)或`java.util.concurrent`(并发处理)等高级特性,以提高服务器的性能和可扩展性。 在压缩包内的"ftp简易服务器"文件,可能是服务器的源码或者相关配置文件。通常,一个...

    Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    在Java中实现实时监听文件夹是否有新文件增加并上传服务器的功能主要涉及到使用Java NIO包中的WatchService接口,以及利用Timer定时任务执行的机制。本文将通过实例代码展示如何结合这两种技术来达到上述功能,并将...

Global site tag (gtag.js) - Google Analytics