`

nio socket

阅读更多

先看一下以前写的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,包括server端和client端

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

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

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

    通过NIOSocket工具,开发者能模拟大量并发连接,测试服务器在高负载下的表现。 该工具提供了服务端和客户端连接测试功能,包括单条发送、循环发送以及模拟多客户端发送,这些功能覆盖了网络通信的多种场景。单条...

    Java NIO Socket基本

    **Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...

    java NIO socket聊天

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

    java nio socket 例子

    本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成

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

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

    NIO socket编程小例子 加法服务器

    总结来说,"NIO socket编程小例子 加法服务器"是一个很好的学习NIO网络编程的起点。通过这个实例,我们可以了解NIO Channel、Buffer和Selector的基本用法,以及如何构建一个简单的网络通信应用。对于任何想要提升...

    基于NIO socket高并发的监控系统

    支持高并发,可以通过socket传输文件。 服务机实现了的功能:1、不间断的接收客户端的消息。2、当有指令过来的时候跟客户机建立连接操作完成后断开连接; 客户机实现了的功能:1、不间断的发送本机运行情况。2、监听...

    nio socket 消息推送

    在`Socket`通信中,`NIO Socket`使用`SocketChannel`代替了`Socket`,`ServerSocketChannel`代替了`ServerSocket`。客户端通过`SocketChannel`连接服务器,服务器端则通过`ServerSocketChannel`监听客户端的连接请求...

    用Netty实现NIO Socket聊天系统示例

    在本示例中,我们将深入探讨如何利用Netty实现一个基于NIO(非阻塞I/O)的Socket聊天系统。NIO是一种I/O模型,它允许Java程序在不阻塞线程的情况下处理多个输入/输出流,从而提高并发性能。 首先,Netty的核心组件...

    Ioserver java Nio socket 框架

    Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!

    原创nio socket mina+javascript+flash实现commet长连接网页聊天室

    【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...

    Mina NIO Socket

    《Mina NIO Socket:深度解析与应用》 在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket...

    nio的socket

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

    java nio 实现socket

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

    Java使用NioSocket手动实现HTTP服务器

    NioSocket是Java的New I/O(Non-blocking I/O)API,提供了非阻塞式的I/O操作,可以提高服务器的性能和可扩展性。 在这个示例中,我们首先创建了一个ServerSocketChannel,用于监听客户端的请求。然后,我们将...

    nio socket编程java代码示例,客户端发送消息,服务端接收

    本示例将详细解析如何使用Java的非阻塞I/O(NIO)实现Socket通信,包括客户端发送消息和服务器端接收消息的过程。 首先,理解NIO(Non-blocking Input/Output)的概念至关重要。NIO与传统的IO模型不同,它提供了对...

    java解读NIOSocket非阻塞模式.zip

    jdk供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个CPU...

Global site tag (gtag.js) - Google Analytics