网络编程

libev 源码解析

Deadly 提交于 2020-01-17 06:03:03
一 libev简介   libev是一个轻量级的事件通知库,具备支持多种事件通知能力,通过对libev的源码的阅读,可以清楚了解事件通知实现内部机制。 二 核心数据结构 在libev中关键的数据结构是,loop结构体,该结构体定义的字段较多,但是主要核心的可以分为两大类 ev_loop结构体(loop为ev_loop结构的全局变量)的字段定义在ev_vars.h头文件中,然后在ev.c中通过include的方式导入 1.各类事件的watcher集合  loop中有支持很多类型的事件,如下 ev_io // IO可读可写 ev_stat // 文件属性变化 ev_signal // 信号处理 ev_timer // 相对定时器 ev_periodic // 绝对定时器 ev_child // 子进程状态变化 ev_fork // fork事件 ev_cleanup // event loop退出触发事件 ev_idle // event loop空闲触发事件 ev_embed // 嵌入另一个后台循环 ev_prepare // event loop之前事件 ev_check // event loop之后事件 ev_async // 线程间异步事件 这些事件的监控管理都对应一种类型的watcher数组,比如 (loop)->anfds :维护所有fd事件 (loop)-

网络编程

感情迁移 提交于 2020-01-17 04:31:43
tcp和udp的区别: https://www.jianshu.com/p/c63b082ac565 1.基于tcp # 服务端 import socket ​ # 创建服务端socket对象 server = socket.socket() ​ # 绑定IP和端口 server.bind(('192.168.3.6',8000)) ​ # 后边可以等5个人 server.listen(5) ​ print('服务端准备开始接收客户端的连接') # 等待客户端来连接,如果没人来就傻傻的等待。 # conn是客户端和服务端连接的对象(伞),服务端以后要通过该对象进行收发数据。 # addr是客户端的地址信息。 # #### 阻塞,只有有客户端进行连接,则获取客户端连接然后开始进行通信。 conn,addr = server.accept() ​ print('已经有人连接上了,客户端信息:',conn,addr) # 通过对象去获取(客户端通过伞给我发送的消息) # 1024表示:服务端获取数据时,一次性最多拿1024字节。 data = conn.recv(1024) print('已经有人发来消息了',data) # 服务端通过连接对象给客户端回复了一个消息。 conn.send(b'stop') ​ # 与客户端断开连接 conn.close() ​ # 关闭服务端的服务

Java基础(19)——网络编程

拥有回忆 提交于 2020-01-16 15:08:02
目录 第一章 网络编程入门 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4 网络编程三要素 协议 IP地址 端口号 第二章 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 ServerSocket类 构造方法 成员方法 2.4 简单的TCP网络程序 TCP通信分析图解 客户端向服务器发送数据 服务器向客户端回写数据 第三章 综合案例 3.1 文件上传案例 文件上传分析图解 基本实现 文件上传优化分析 优化实现 信息回写分析图解 回写实现 3.2 模拟B\S服务器(扩展知识点) 案例分析 案例实现 访问效果 第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。 B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势,但是无论哪种架构,都离不开网络的支持。 网络编程 ,就是在一定的协议下,实现两台计算机的通信的程序。 1.2 网络通信协议 **网络通信协议:**通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议

【一篇入魂】网络编程中的五种IO模型

点点圈 提交于 2020-01-16 14:35:22
我们在进行编程开发的时候,经常会涉及到同步,异步,阻塞,非阻塞,IO多路复用等概念,这几个概念有区别,但是有时候也容易混淆,如果不总结一下的话很容易受到困扰,下面就记录一下这几个概念的理解。 Unix网络编程中的五种IO模型 Blocking IO - 阻塞IO NoneBlocking IO - 非阻塞IO IO multiplexing - IO多路复用 signal driven IO - 信号驱动IO asynchronous IO - 异步IO 由于 signal driven IO 在实际使用中并不常用,所以这里只讨论剩下的四种IO模型。 在讨论之前先说明一下IO发生时涉及到的对象和步骤,对于一个network IO,它会涉及到两个系统对象: application 调用这个IO的进程 kernel 系统内核 那他们经历的两个交互过程是: 阶段1 wait for data 等待数据准备 阶段2 copy data from kernel to user 将数据从内核拷贝到用户进程中 之所以会有同步、异步、阻塞和非阻塞这几种说法就是根据程序在这两个阶段的处理方式不同而产生的。了解了这些背景之后,我们就分别针对四种IO模型进行讲解。 Blocking IO - 阻塞IO 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概如下图:

Java网络编程——概念

有些话、适合烂在心里 提交于 2020-01-16 04:21:57
基础 TCP协议 IP协议 TCP/IP UDP协议 端口 套接字 Java.net包 InetAddress类 任何一台运行的Internet上的主机都有IP地址和当地的DNS能够解析的域名 在Java.net包中就提供了IP地址的封装类InetAddress,InetAdress类用于描述和包装一个Internet IP地址,并提供了相关的常见的方法 TCP的网络编程 Socket 重要的Socket API 服务器端程序设计 客户端程序设计 UDP通信概念 UDP通信又称数据包通信,UDP协议采用的是基于数据包的网络通信。数据包是一种分组交换的形式,就是把所有要传送的数据分段打包,再传出去,他是无连接型的,是把打成的每个包都作为独立的报文传出去,所以叫做数据包。 在java的UDP网络程序中,主要用到两个类,java.net.DatagramSocket和java.net.DatagramPacket类,前者是发送和接收数据的数据包套接字,后者是UDP所传输的数据包,即打包后的数据。 TCP协议 TCP (transmission Control protocol) 即传输控制协议,它是传输层协议,主要负责数据得分组和重组,TCP协议是一种可靠的数据传输协议,它是面向连接的,它可以保证数据的传送时间,顺序,和内容的正确无误。但是在保证数据高效的同时,它的传输速度往往是比较慢的

网络编程之一

不问归期 提交于 2020-01-16 01:07:10
文件发送: 发送端: public class Send { public static void main(String[] args) throws IOException { //发送端 DatagramSocket send=new DatagramSocket(); //准备集装箱 BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File("d:/Hello/timg.jpg"))); byte[] bs=new byte[1024]; int len; InetAddress byName = InetAddress.getByName("127.0.0.1"); while ((len=bis.read(bs))!=-1){ DatagramPacket dp=new DatagramPacket(bs,len,byName,6666); send.send(dp); } } } 接收端: public class Receive { public static void main(String[] args) throws IOException { DatagramSocket rec = new DatagramSocket(6666); byte[] bytes =

Linux-C网络编程

旧巷老猫 提交于 2020-01-15 00:13:56
简介 基础是TCP/IP协议,网上资料很多不再赘述。 推荐《图解TCP/IP》 socket编程 网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出, 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存 因此,网络数据流的地址规定:先发出的数据是低地址,后发出的数据是高地址 TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。 例如UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8) 则地址0是0x03,地址1是0xe8,也就是先发0x03,再发0xe8 这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。 但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。 因此,发送主机把1000填到发送缓冲区之前需要做字节序的转换。 同样地,接收主机如果是小端字节序的,接到16位的源端口号也要做字节序的转换。 如果主机是大端字节序的,发送和接收都不需要做转换。 同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。 网络字节序转换 为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行 可以调用以下库函数做网络字节序和主机字节序的转换 #include <arpa/inet.h> uint32_t htonl

Socket网络通讯

独自空忆成欢 提交于 2020-01-14 11:52:25
什么 是网络模型 网络编程的本质是两个设备之间的数据交换,当然,在 计算机网络 中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。   现在的网络编程基本上都是基于请求 /响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。   在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端 (Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。   连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。   在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是 BT、emule这类软件了。 下面来谈一下如何建立连接以及如何发送数据。 IP 地址 与 域名 在现实生活中,如果要打电话则需要知道对应人的电话号码,如果要寄信则需要知道收信人的地址。在网络中也是这样,需要知道一个设备的位置,则需要使用该设备的 IP地址,具体的连接过程由硬件实现,程序员不需要过多的关心。    IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成

BIO阻塞式网络编程

笑着哭i 提交于 2020-01-14 05:04:53
目录 BIO网络编程 基本的服务端和客户端,Socket+IO 利用多线程技术,解决socketServer线程阻塞的问题 Http协议 Socket+IO和浏览器进行交互 BIO - 阻塞IO的含义 BIO网络编程 基本的服务端和客户端,Socket+IO。 out.write(msg.getBytes(charset)); // 阻塞,写完成 serverSocket.accept(); //阻塞 reader.readLine(); // 没有数据,阻塞 出现的问题:因为服务端有阻塞线程的操作,所以在没处理完之前,只能阻塞线程,即同时 只能处理一个请求 和 一个请求的数据 。 //客户端 public class BIOClient { private static Charset charset = Charset . forName ( "UTF-8" ) ; public static void main ( String [ ] args ) throws Exception { Socket s = new Socket ( "localhost" , 8080 ) ; OutputStream out = s . getOutputStream ( ) ; Scanner scanner = new Scanner ( System . in ) ; System