NIO2 (1) --- TCP (blocking)

這一篇要說明的是,如何使用 JDK 7 推出的 NIO 2 進行 TCP
程式開發,底下的類別圖只是其中較重要的部份,要詳細了解各類別關係,及各類別的 method,請查閱 API Documents。

NIO 2 同時提供 blocking 和 non-blocking 的模式,blocking
模式的程式因為會在接收資料時程式暫停,直到完整收完資料才又繼續執行,程式邏輯會是循序的; non-blocking
模式並不會停在接收資料的那一行程式上,而是繼續執行,至於資料傳入時,通常就由另一個執行緒接收並處理,所以,non-blocking
程式會寫成多執行緒,邏輯也會複雜許多,好處是效率會比較好。底下先來看一下個 blocking 程式,很簡單的一個 echo sever。


 1 package idv.steven.nio2;
2
3 import java.io.IOException;
4 import java.net.InetSocketAddress;
5 import java.net.StandardSocketOptions;
6 import java.nio.ByteBuffer;
7 import java.nio.channels.ServerSocketChannel;
8 import java.nio.channels.SocketChannel;
9
10 public class EchoServer {
11
12 public static void main(String[] args) {
13 final int DEFAULT_PORT = 5555;
14 final String IP = "127.0.0.1";
15 ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
16
17 //create a new server socket channel
18 try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
19 //continue if it was successfully created
20 if (serverSocketChannel.isOpen()) {
21 //set the blocking mode
22 serverSocketChannel.configureBlocking(true);
23 //set some options
24 serverSocketChannel.setOption(StandardSocketOptions.SO_RCVBUF, 4 * 1024);
25 serverSocketChannel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
26 //bind the server socket channel to local address
27 serverSocketChannel.bind(new InetSocketAddress(IP, DEFAULT_PORT));
28 //display a waiting message while ... waiting clients
29 System.out.println("Waiting for connections ...");
30 //wait for incoming connections
31 while(true){
32 try (SocketChannel socketChannel = serverSocketChannel.accept()) {
33 System.out.println("Incoming connection from: " +
34 socketChannel.getRemoteAddress());
35 //transmitting data
36 while (socketChannel.read(buffer) != -1) {
37 buffer.flip();
38 socketChannel.write(buffer);
39 if (buffer.hasRemaining()) {
40 buffer.compact();
41 } else {
42 buffer.clear();
43 }
44 }
45 }
46 catch (IOException ex) {
47
48 }
49 }
50 } else {
51 System.out.println("The server socket channel cannot be opened!");
52 }
53 }
54 catch (IOException ex) {
55 System.err.println(ex);
56 }
57 }
58 }

現在來解釋一下上面的程式:

  • Line 15: allocate 一塊記憶體,作為接收資料之用。

  • Line 18: 開啟一個 channel 作為接收資料之用,但此時尚未真正將服務 bind 到指定的 IP 和 port 上。

  • Line 20: 檢查是否確實開啟成功。

  • Line 22: 設定這個 TCP 服務為 blocking 模式。

  • Line 25: 這個設定在 multicast 才有用,在 TCP 其實可以不用設定。

  • Line 27: 到這裡,服務才真的 bind 到網路上。

  • Line 32: 程式會停在這,等待 request 進來。

  • Line 36~44: 將收到的資料放到 buffer。

NIO2 (1) --- TCP (blocking),布布扣,bubuko.com

时间: 2024-12-29 23:22:22

NIO2 (1) --- TCP (blocking)的相关文章

【Java nio】Blocking nio2

package com.slp.nio; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import jav

异步tcp通信——APM.Core 服务端概述

为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给线程池中的某个工作线程来完成.当开始I/O操作的时候,异步会将工作线程还给线程池,这意味着获取网页的工作不会再占用任何CPU资源了.直到异步完成,即获取网页完毕,异步才会通过回调的方式通知线程池.可见,异步模式借助于线程池,极大地节约了CPU的资源. 注:DMA(Direct Memory Acce

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

使用OTP原理构建一个非阻塞的TCP服务器(转)

经测试可用! 原文地址:http://www.iucai.com/?paged=8 Erlang OTP设计原理已经被shiningray兄翻译透了.请参见.http://erlang.shiningray.cn/otp-design-principles/index.html 这里翻译了一篇余锋老大和lzy.je老大推荐的文章,闲话不说,奉上. 使用OTP原理构建一个非阻塞的TCP服务器 原文网址:(打不开的同学请自觉FQ) http://www.trapexit.org.nyud.net:8

TCP/IP网络编程中socket的行为

一. read/write的语义:为什么会阻塞? 先从write说起: #include <unistd.h>ssize_t write(int fd, const void *buf, size_t count); 首先,write成功返回,只是buf中的数据被复制到了kernel中的TCP发送缓冲区.至于数据什么时候被发往网络,什么时候被对方主机接收,什么时候被对方进程读取,系统调用层面不会给予任何保证和通知. write在什么情况下会阻塞?当kernel的该socket的发送缓冲区已满时

TCP协议缺陷不完全记录

原文转自:http://itindex.net/detail/53400-tcp-%E5%AE%8C%E5%85%A8 零.前言 TCP自从1974年被发明出来之后,历经30多年发展,目前成为最重要的互联网基础协议.有线网络环境下,TCP表现的如虎添翼,但在移动互联网和物联网环境下,稍微表现得略有不足. 移动互联网突出特性不稳定:信号不稳定,网络连接不稳定.虽然目前发展到4G,手机网络带宽有所增强,但因其流动特性,信号也不是那么稳定:坐长途公交车,或搭乘城铁时,或周边上网密集时等环境,现实环境很

High Performance Browser Networking - TCP UDP TLS

时延 时延的定义和标准 时延简单的说是从原点到目标点传送一条信息或者一个数据包,所花费的时间. 时延=发送时延+传播时延+处理时延+排队时延: Propagation delay 传播时延 传播时延这个概念,是指电磁信号或者光信号在传输介质中传输的时延,而在光纤或者铜线中,光信号和电磁信号的传播速度都在20万公里/秒以上,在传输介质中传输的是电磁信号或者光信号,而不是数据! Transmission delay 传送时延 发送时延是指结点在发送数据时使数据块从结点进入到传输媒体所需的时间,也就是

理解socket与tcp/ip编程相关函数

Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面的.如果了解Unix系统的输入和输出的话,就很容易了解Socket了.网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S

热备份路由协议(HSRP)与生成树协议(TCP)

热备份路由协议与生成树协议 实验01: 热备份路由协议(HSRP) 实验目标:共享一个虚拟IP地址,该IP地址作为内网主机的网关 实验环境:出口设备上配置热备份路由协议(HSRP),组成一个HSRP组,组内 两个出口设备共享一个虚拟IP地址,该IP地址作为内网主机的网关 实验拓扑图: 实验步骤: 一. 配置IP地址 1. 配置PC0 IP地址 2. 配置PC1 IP地址 3.配置PC2 IP地址 二. 配置路由器热备份路由协议 1. 配置路由器1 1) Router#configure term