java nio网络编程服务篇入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java nio网络编程服务篇入门相关的知识,希望对你有一定的参考价值。

服务端写完了,现在写一个客户端,对于客户端,我考虑使用nio或阻塞socket都可以。

使用nio的客户端:

 1 /**
 2  * 初始化网络连接
 3  */
 4 public void run() {
 5 
 6     // 开启网络连接
 7     try {
 8         channel = SocketUtils.connect("127.0.0.1",8080);
 9         selector = Selector.open();
10         channel.register(selector, SelectionKey.OP_CONNECT);
11         while(running) {
12             selector.select();
13             Iterator ite = selector.selectedKeys().iterator();
14             while (ite.hasNext()) {
15                 SelectionKey key = (SelectionKey) ite.next();
16                 ite.remove();
17                 readData(key);
18             }
19         }
20     } catch (Throwable e) {
21         logger.error(" socket or other fail!",e);
22     } finally {
23         // 关闭channel
24         if (channel != null) {
25             try {
26                 channel.close();
27             } catch (IOException e) {
28                 e.printStackTrace();
29             }
30         }
31         // 关闭selector
32         if (selector != null) {
33             try {
34                 selector.close();
35             } catch (IOException e) {
36                 e.printStackTrace();
37             }
38         }
39     }
40 }

读取数据方式和服务端一样,就不写了。

 

下面是阻塞socket方式:

 1 public void run(){
 2     byte[] buffer = new byte[512];
 3     running = true;
 4     while(running) {
 5         try {
 6             socket = new Socket("127.0.0.1", 8080);
 7             InputStream inputStream = socket.getInputStream();
 8             OutputStream outputStream = socket.getOutputStream();
 9             handleConnectListener(ConnectListener.ConnectStatus.connected);
10             // 读取数据
11             int bufferCount = -1;
12             ByteBuffer byteBuffer = ByteBuffer.allocate(buffer.length*2);
13             messageHandler.initByteBufferSize(byteBuffer.capacity());
14             while ((bufferCount = inputStream.read(buffer))>=0){
15                 byteBuffer.put(buffer,0,bufferCount);
16                 // TODO 解析 
17             }
18         } catch (Exception e) {
19             e.printStackTrace();
20         }
21     }
22 }

客户端在连接时,是继承Thread的,调用时记得start()。

虽然第二个实例没有使用nio,但使用bytebuffer,这个东西还是很好用的。

 

以上是关于java nio网络编程服务篇入门的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO6:选择器2---代码篇

Java NIO6:选择器2---代码篇

六.Netty入门到超神系列-Java NIO零拷贝实战

java入门篇12 --- IO操作

RPC高性能框架总结3.NIO示例代码编写和简析

Java入门系列-25-NIO(实现非阻塞网络通信)