0 0

关于NIO进行socket通信的一个不解的地方 3

服务器端代码:
package nio.tcp;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import java.util.Iterator;import java.util.Set;public class UnblockServer {	public static void main(String[] args) {		SocketChannel socket = null;		try {			// 打开一个选择器			Selector selector = Selector.open();			// 客户端要使用SocketChannel,对应服务器的ServerSocketChannel			ServerSocketChannel ssc = ServerSocketChannel.open();			// 绑定服务器IP和端口			InetSocketAddress isa = new InetSocketAddress(8710);			ssc.socket().bind(isa);			ssc.configureBlocking(false);			// 向selector注册,要处理的是接收传入事件,所以权限设置为OP_ACCEPT			SelectionKey acceptKey = ssc.register(selector,SelectionKey.OP_ACCEPT);			// 操作?			while (selector.select() > 0) {				Set<SelectionKey> readyKeys = selector.selectedKeys();				Iterator it = readyKeys.iterator();				while (it.hasNext()) {					SelectionKey key = (SelectionKey) it.next();					it.remove();					if (key.isAcceptable()) {						System.out.println("Key is Acceptable");						socket = (SocketChannel) ssc.accept();						socket.configureBlocking(false);						socket.register(selector,								SelectionKey.OP_READ | SelectionKey.OP_WRITE);					}					if (key.isReadable()) {						System.out.println("Key is readable");						socket = (SocketChannel) key.channel();						ByteBuffer buf = ByteBuffer.allocate(1024);						socket.read(buf);						buf.flip();						// 这段实用						Charset charset = Charset.forName("us-ascii");						CharsetDecoder decoder = charset.newDecoder();						CharBuffer charBuffer = decoder.decode(buf);						String result = charBuffer.toString();						System.out.println("Receive Data:" + result);					}					if (key.isWritable()) {						System.out.println("Key is writable");						String msg = "Message from server";						socket = (SocketChannel) key.channel();						//类型转换,实用						Charset set = Charset.forName("us-ascii");						CharsetDecoder dec = set.newDecoder();						CharBuffer charBuf = dec.decode(ByteBuffer.wrap(msg.getBytes()));						System.out.println("Message from server:" + charBuf.toString());						int nBytes = socket.write(ByteBuffer.wrap((charBuf.toString()).getBytes()));					}				}			}		} catch (Exception e) {			e.printStackTrace();		}	}}



客户端代码:
package nio.tcp;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SocketChannel;public class UnblockClient {		public static void main(String[] args) {		try {						InetSocketAddress ia = new InetSocketAddress(InetAddress.getLocalHost(),8710);						//客户端要使用SocketChannel,对应服务器的ServerSocketChannel			SocketChannel client = SocketChannel.open();			client.connect(ia);			//设置为非阻塞,否则就和刚才的程序没啥区别了			client.configureBlocking(false);						//发送数据			sendMessage(client);								} catch (Exception e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}		public static int sendMessage(SocketChannel client) {		System.out.println("Inside SendMessage");		String msg = null;		ByteBuffer bytebuf;		int nBytes = 0;		try {			msg = "It's message from client!";			System.out.println("msg is "+msg);			bytebuf = ByteBuffer.wrap(msg.getBytes());			for (int i = 0; i < 3; i++) {				nBytes = client.write(bytebuf);				System.out.println(i + " finished");			}			try {				Thread.sleep(5000);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}			client.close();			return -1;		} catch (IOException e) {			e.printStackTrace();		}		return nBytes;	 }}


我已经和网上的N多类似程序对照过了,但是我就是弄不明白,为什么客户端明明只是发送了三次数据,而服务器端却会不停地执行write和read操作呢?不是应该执行一次之后就完了的吗?
2009年3月10日 12:43

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

0 0

没有在eclipse里面试,不过我猜想你把server中的写事件不注册到selector中,因该就不是一直循环了吧?写事件我们自己直接发送就好了,我以前好像也碰到过类似的问题.

2009年3月10日 17:18

相关推荐

    基于java NIO的socket通信demo

    在`NioClient.java`中,客户端同样使用NIO进行通信。客户端首先创建一个`SocketChannel`,然后向服务器的`ServerSocketChannel`发起连接请求。接着,客户端可以设置自己的`Charset`来确保数据在传输过程中不出现乱码...

    《NIO与Socket编程技术指南》_高洪岩

    《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...

    Nio非阻塞socket通信demo

    在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **Java NIO基础** - **通道(Channels)**:NIO的核心概念之一,通道是数据读写的目标或来源,如文件通道、套接字通道等。...

    java nio 实现socket

    ### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...

    基于NIO的socket举例

    基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例基于NIO的socket举例 基于NIO的socket举例

    java基于nio的socket通信.rar

    Socket通信是网络编程的基本元素,它允许两台计算机通过TCP/IP协议进行通信。将Java NIO与Socket结合,可以构建出高效、可扩展的网络应用程序。 1. **Java NIO基础** Java NIO的核心组件包括通道(Channel)、缓冲...

    《NIO与Socket编程技术指南》高洪岩.zip

    非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...

    socket通信NIO代理模式demo实例

    本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的代理服务器。 代理模式是一种设计模式,它允许我们创建一个代理对象来控制对原对象的访问。在NIO代理模式中,代理服务器作为客户端与目标...

    默蓝网络通信测试工具(NIOSocket工具)支持TCP/IP和HTTP通信-网络通信开发人员必备

    "默蓝网络通信测试工具(NIOSocket工具)"正是这样一款针对TCP/IP和HTTP通信的专业测试工具,它为网络通信开发人员提供了强大的测试与分析能力。 首先,我们要理解TCP/IP协议的重要性。TCP(传输控制协议)和IP(网际...

    nio的socket

    在NIO中,Socket通信不再局限于传统的`java.net.Socket`和`java.net.ServerSocket`,而是通过`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`进行。 1. **SocketChannel**:这是NIO中...

    使用NIO实现非阻塞socket通信

    本项目利用NIO实现了一个简单的非阻塞socket通信的聊天工具,使得在高并发环境下,服务器能够同时处理多个客户端连接,提高系统性能。 1. **非阻塞I/O**: 在BIO模型中,读写操作是阻塞的,即当没有数据可读或无法...

    java NIO socket聊天

    `Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...

    Java NIO Socket基本

    在NIO中,我们不再像BIO那样等待一个操作完成,而是通过选择器(Selector)监控多个通道(Channel),从而实现多路复用。 在Java NIO中,核心组件包括以下几个: 1. **通道(Channel)**:类似于流,但支持双向...

    采用NIO实现一个Socket服务器

    本篇将基于给定的标题“采用NIO实现一个Socket服务器”来详细阐述如何使用NIO进行Socket服务端的开发。 首先,理解NIO的核心概念: 1. **通道(Channel)**:通道是连接到I/O设备的途径,可以读取或写入数据。常见的...

    NioSocket,包括server端和client端

    NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...

    Socket 之 BIO、NIO、Netty 简单实现

    在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...

    一般Socket客户端与Mina NIO Socket客户端对比示例

    本文将通过一个对比实例,探讨一般Socket客户端与Mina NIO (Non-blocking I/O) Socket客户端的差异和特点,帮助开发者理解这两种技术在实际应用中的选择。 首先,普通Socket客户端基于BIO(Blocking I/O)模型,它...

    android-socket-nio-master.zip

    "android-socket-nio-master.zip" 是一个关于Android中使用Socket结合NIO实现高效通信的项目,其目标是提高Socket通信的性能和处理大量并发连接的能力。 NIO(非阻塞I/O)是Java提供的一个替代传统I/O的API,主要...

    java socket nio 研究

    `NonBlockingServer.java`和`Client.java`的代码分析和实践,可以帮助我们更好地理解和掌握Java NIO在Socket通信中的应用。在实际开发中,我们还需要考虑异常处理、资源管理等细节,以确保系统的稳定性和可靠性。

Global site tag (gtag.js) - Google Analytics