fd

NIO之Channel、Buffer

萝らか妹 提交于 2020-03-28 16:30:53
前言 Java NIO 由以下几个核心部分组成: 1 、Buffer 2、Channel 3、Selector 传统的IO操作面向数据流,意味着每次从流中读一个或多个字节,直至完成,数据没有被缓存在任何地方。 NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer中处理数据。 本文着重介绍Channel和Buffer的概念以及在文件读写方面的应用和内部实现原理。 Buffer A buffer is a linear, finite sequence of elements of a specific primitive type. 一块缓存区,内部使用字节数组存储数据,并维护几个特殊变量,实现数据的反复利用。 1、 mark :初始值为-1,用于备份当前的position; 2、 position :初始值为0,position表示当前可以写入或读取数据的位置,当写入或读取一个数据后,position向前移动到下一个位置; 3、 limit :写模式下,limit表示最多能往Buffer里写多少数据,等于capacity值;读模式下,limit表示最多可以读取多少数据。 4、 capacity :缓存数组大小 mark() :把当前的position赋值给mark public final Buffer mark() { mark =

socket编程的select模型

爷,独闯天下 提交于 2020-03-28 01:56:57
在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的监听客户端的请求,有新的请求到达时,开辟一个新的线程去和该客户端进行后续处理,但是这样针对每一个客户端都需要去开辟一个新的线程,效率必定底下。 其实,socket编程提供了很多的模型来处理这种情形,我们只要按照模型去实现我们的代码就可以解决这个问题。主要有select模型和重叠I/o模型,以及完成端口模型。这次,我们主要介绍下select模型,该模型又分为普通select模型,wsaasyncselect模型,wsaeventselect模型。我们将通过样例代码的方式逐一介绍。 一、select模型 使用该模型时,在服务端我们可以开辟两个线程,一个线程用来监听客户端的连接 请求,另一个用来处理客户端的请求。主要用到的函数为select函数。如: 全局变量: fd_set g_fdClientSock; 线程1处理函数: SOCKET listenSock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(7788);

swoole 示例

我的未来我决定 提交于 2020-03-27 14:54:20
$str = $_GET['a'];$client = new swoole_client(SWOOLE_SOCK_TCP);if (!$client->connect("127.0.0.1", 9501, -1)){ exit("connect failed. Error: {$client->errCode}\n");}$client->send("hello world\n" . $str);echo $client->recv(); //打印 接收到的数据$client->close(); $server = new swoole_server("127.0.0.1", 9501);$server->on('connect', function ($server, $fd){ echo "connection open: {$fd}\n";});$server->on('receive', function ($server, $fd, $reactor_id, $data) { $server->send($fd, "Swoole: {$data}"); $server->close($fd);});$server->on('close', function ($server, $fd) { echo "connection close: {$fd}\n";});

php socket 编程

做~自己de王妃 提交于 2020-03-25 15:02:30
文章目录 1.实验预习:tcp协议 2.SOCKET 编程 3.多进程编程 4 I/O复用 5. 信号通信以及守护进程 1.实验预习:tcp协议 TCP协议的创建: 创建流程:1.客户端主动调用connect发送SYN分节;2.服务器端必须回复一个ACK分节来确认客户端的SYN分节,并发送一个SYN分节给客户端;3.客户端对服务器端发送SYN分节进行ACK分节的确认 TCP协议的拆除(TCP为全双工的传输协议,所以需要4次分节的交换): 拆除流程:1.首先申请拆除的一端调用close发送一个FIN分节;2.另一端接收到FIN分节时,发送一个ACK分节进行确认;3.另一端要申请拆除连接时,也要发送一个FIN分节;4.接收端发送一个ACK分节进行确认 TCP的状态转换图 连接: 1.SYN_SENT主动打开,SYN分节已发送; 2.SYN_RCVD被动打开,SYN分节已接收; 3.ESTABLISHED已经建立连接 关闭: 1.FIN_WAIT_1发起主动关闭,FIN分节已发送; 2.CLOSE_WAIT被动关闭,FIN分节已接收,ACK分节已发送; 3.FIN_WAIT_2成功实现半关闭,ACK分节已接收; 4.LAST_ACK最终的ACK,FIN分节已发送; 5.TIME_WAIT FIN分节已接收,ACK分节已发送; 6.CLOSE ACK分节已接收,成功拆除连接] 2

socket example

自闭症网瘾萝莉.ら 提交于 2020-03-25 03:16:27
for code copy in the future simple server and client may be useful for copy in the future server: [cpp] view plain copy #include <errno.h> #include "sys/types.h" #include "sys/socket.h" #include "sys/stat.h" #include "unistd.h" #include <netinet/in.h> //#include <arpa/inet.h> #include <fcntl.h> #define SERVER_PORT (56738) #define SERVER_IP "127.0.0.1" #define LOG printf static void handle_crashing_process_new( int fd) { int n; unsigned int tid; int length = getpid(); int retry = 30; printf( "handle_crashing_process_new in\n" ); while ((n = read(fd, &tid, sizeof (unsigned))) != sizeof (unsigned

IO多路复用之select poll epoll

夙愿已清 提交于 2020-03-24 11:31:37
参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制, 可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作 。 但select(),poll(),epoll()本质上都是同步I/O ,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 与多线程和多进程相比,I/O 多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。 select 监视并等待多个文件描述符的属性变化(可读、可写或错误异常) select()函数监视的文件描述符分 3 类,分别是writefds、readfds、和 exceptfds 调用后 select() 函数会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时( timeout 指定等待时间),函数才返回 当 select()函数返回后,可以通过遍历 fdset,来找到就绪的描述符 int select(int nfds, fd_set

I/O 多路复用之select、poll、epoll详解

风流意气都作罢 提交于 2020-03-24 11:13:34
  select,poll,epoll都是IO多路复用的机制。I/O多路复用就是 通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 1.select   select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。    select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。   select有3个缺点:     每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大。  

Turtle库学习笔记

纵饮孤独 提交于 2020-03-23 19:31:25
一、 基础概念 1、画布:画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置。常用的画布方法有两个:screensize()和setup()。 (1) turtle.screensize(canvwidth, canvheight, bg) :参数分别为画布的宽(单位像素), 高, 背景颜色 如:turtle.screensize(500,1000,'green') (2) turtle.setup(width, height, startx, starty) :width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例。(startx, starty): 这一坐标表示 矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。 2、画笔:在画布上,默认有一个坐标原点为画布中心的坐标轴, 坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:标原点(位置),面朝x轴正方向(方向),turtle绘图中, 就是使用位置方向描述小乌龟(画笔)的状态。 (1)画笔属性: 1) turtle.pensize() :设置画笔的宽度; 2) turtle.pencolor() :没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。 3)

select、poll、epoll之间的区别总结[整理]

冷暖自知 提交于 2020-03-22 23:42:20
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。关于这三种IO多路复用的用法,前面三篇总结写的很清楚,并用服务器回射echo程序进行了测试。连接如下所示: select: http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html poll: http://www.cnblogs.com/Anker/archive/2013/08/15/3261006.html epoll: http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html   今天对这三种IO多路复用进行对比,参考网上和书上面的资料,整理如下: 1、select实现 select的调用过程如下所示: (1)使用copy_from_user从用户空间拷贝fd_set到内核空间 (2)注册回调函数__pollwait (3)遍历所有fd

聊聊IO多路复用之select、poll、epoll详解

南笙酒味 提交于 2020-03-22 23:41:55
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。 目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,pselect,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 对于IO多路复用机制不理解的同学,可以先行参考《聊聊Linux 五种IO模型》,来了解Linux五种IO模型。