先看一下以前写的socket服务器:
--old socket
server:
serversocket对象server 指定port
调用accept方法阻塞
用输入输出流socket.getInputStream() , socket.getOutputStream()
向客户端接受发送信息
client:
socket对象client 指定ip和port
用输入输出流socket.getInputStream() , socket.getOutputStream()
向客户端接受发送信息
//server public void initSocketServer() throws IOException{ ServerSocket server = null; server = new ServerSocket(10100); Socket socket = server.accept(); String line; BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter os = new PrintWriter(socket.getOutputStream()); line = "server start and send msg1"; os.println(line); os.flush(); System.out.println("cient:"+is.readLine()); is.close(); os.close(); } //client public void clientSocket() throws UnknownHostException, IOException{ Socket socket = new Socket("localhost",10100); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); PrintWriter pw = new PrintWriter(socket.getOutputStream()); String line = reader.readLine(); System.out.println("server: "+line); pw.write("dirk come back"); pw.flush(); reader.close(); pw.close(); }
接下来是nio socket:
--new socket
server:
serverSocketChannel对象 用open实例化
管道调用configureBlocking设置是否阻塞
管道绑定端口serverChannel.socket().bind(new InetSocketAddress(port));
开启管道管理器Selector.open();
注册server accept client事件
循环遍历
调用selector.select()方法阻塞,直到有注册的事件 如客户端channel.connect(new InetSocketAddress(host, port));
遍历事件
当是accept时,注册读事件
当是
client:
SocketChannel对象 用open实例化
管道调用configureBlocking设置是否阻塞
管道绑定host和port channel.connect(new InetSocketAddress(host, port)); //发起accept事件
开启管道管理器Selector.open();
注册client connect server事件
循环遍历
selector.select();
遍历事件
当有connet时,注册read事件,删除connet事件
server:
public class NewSocketServer { private Selector selector; public void initServer(int port) throws IOException{ ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.socket().bind(new InetSocketAddress(port)); this.selector = Selector.open(); serverChannel.register(this.selector, SelectionKey.OP_ACCEPT); } public void listen() throws IOException{ System.out.println("server start"); while(true){ selector.select(); Iterator ite = this.selector.selectedKeys().iterator(); while(ite.hasNext()){ SelectionKey key = (SelectionKey) ite.next(); ite.remove(); if(key.isAcceptable()){ ServerSocketChannel server = (ServerSocketChannel)key.channel(); SocketChannel channel = server.accept(); channel.configureBlocking(false); channel.write(ByteBuffer.wrap(new String("server: server start and send msg").getBytes())); channel.register(this.selector, SelectionKey.OP_READ); }else if(key.isReadable()) read(key); } } } public void read(SelectionKey key) throws IOException{ if(key.channel() instanceof ServerSocketChannel) System.out.println("server: serverchannel read"); SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(100); channel.read(buffer); buffer.flip(); byte[] data = new byte[buffer.limit()]; buffer.get(data); System.out.println("服务器收到信息:"+new String(data)); ByteBuffer outbuffer = ByteBuffer.wrap(new String("服务器返回信息").getBytes()); channel.write(outbuffer); } public static void main(String[] args) throws IOException{ NewSocketServer server = new NewSocketServer(); server.initServer(10110); server.listen(); } }
client:
public class NewSocketClient { private Selector selector; public void initClient(String host,int port) throws IOException{ SocketChannel channel = SocketChannel.open(); channel.configureBlocking(false); this.selector = Selector.open(); channel.connect(new InetSocketAddress(host, port)); channel.register(this.selector, SelectionKey.OP_CONNECT); } public void listen() throws IOException{ while (true) { selector.select(); for (Iterator iterator = this.selector.selectedKeys().iterator(); iterator.hasNext();) { SelectionKey key = (SelectionKey) iterator.next(); iterator.remove(); if(key.isConnectable()){ SocketChannel channel = (SocketChannel) key.channel(); if(channel.isConnectionPending()) channel.finishConnect(); channel.configureBlocking(false); channel.write(ByteBuffer.wrap(new String("dirk coming back").getBytes())); channel.register(this.selector, SelectionKey.OP_READ); }else if(key.isReadable()) read(key); } } } public void read(SelectionKey key) throws IOException{ if(key.channel() instanceof ServerSocketChannel) System.out.println("server: serverchannel read"); SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer bb = ByteBuffer.allocate(100); channel.read(bb); bb.flip(); byte[] b = new byte[bb.limit()]; bb.get(b); System.out.println(new String(b)); channel.write(ByteBuffer.wrap(new String("客户端返回信息").getBytes())); } public static void main(String[] args) throws IOException { NewSocketClient client = new NewSocketClient(); client.initClient("localhost", 10110); client.listen(); } }
转 http://weixiaolu.iteye.com/blog/1479656
相关推荐
NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...
通过NIOSocket工具,开发者能模拟大量并发连接,测试服务器在高负载下的表现。 该工具提供了服务端和客户端连接测试功能,包括单条发送、循环发送以及模拟多客户端发送,这些功能覆盖了网络通信的多种场景。单条...
**Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...
`Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...
本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成
本文将通过一个对比实例,探讨一般Socket客户端与Mina NIO (Non-blocking I/O) Socket客户端的差异和特点,帮助开发者理解这两种技术在实际应用中的选择。 首先,普通Socket客户端基于BIO(Blocking I/O)模型,它...
总结来说,"NIO socket编程小例子 加法服务器"是一个很好的学习NIO网络编程的起点。通过这个实例,我们可以了解NIO Channel、Buffer和Selector的基本用法,以及如何构建一个简单的网络通信应用。对于任何想要提升...
支持高并发,可以通过socket传输文件。 服务机实现了的功能:1、不间断的接收客户端的消息。2、当有指令过来的时候跟客户机建立连接操作完成后断开连接; 客户机实现了的功能:1、不间断的发送本机运行情况。2、监听...
在`Socket`通信中,`NIO Socket`使用`SocketChannel`代替了`Socket`,`ServerSocketChannel`代替了`ServerSocket`。客户端通过`SocketChannel`连接服务器,服务器端则通过`ServerSocketChannel`监听客户端的连接请求...
在本示例中,我们将深入探讨如何利用Netty实现一个基于NIO(非阻塞I/O)的Socket聊天系统。NIO是一种I/O模型,它允许Java程序在不阻塞线程的情况下处理多个输入/输出流,从而提高并发性能。 首先,Netty的核心组件...
Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!
【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...
在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...
《Mina NIO Socket:深度解析与应用》 在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket...
在NIO中,Socket通信不再局限于传统的`java.net.Socket`和`java.net.ServerSocket`,而是通过`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`进行。 1. **SocketChannel**:这是NIO中...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
NioSocket是Java的New I/O(Non-blocking I/O)API,提供了非阻塞式的I/O操作,可以提高服务器的性能和可扩展性。 在这个示例中,我们首先创建了一个ServerSocketChannel,用于监听客户端的请求。然后,我们将...
本示例将详细解析如何使用Java的非阻塞I/O(NIO)实现Socket通信,包括客户端发送消息和服务器端接收消息的过程。 首先,理解NIO(Non-blocking Input/Output)的概念至关重要。NIO与传统的IO模型不同,它提供了对...
jdk供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个CPU...