socket函数

Linux EPOLL内核代码学习笔记

允我心安 提交于 2019-11-29 10:19:59
内容目录 什么是EPOLL EPOLL接口 EPOLL机制 两张图 什么是EPOLL 摘录自manpage介绍 man:epoll(7) epoll(4) epoll is a variant of poll(2) that can be used either as an edge-triggered or a level-triggered interface and scales well to large numbers of watched file descriptors. EPOLL接口 epoll_create (or epoll_create1) epoll_create opens an epoll file descriptor by requesting the kernel to allocate an event backing store dimensioned for size descriptors. epoll_ctl epoll_ctl() opens an epoll file descriptor by requesting the kernel to allocate an event backing store dimensioned for size descriptors. epoll_wait The epoll_wait()

python day51

别说谁变了你拦得住时间么 提交于 2019-11-29 10:08:31
今日内容 Web框架的本质 我们可以这样理解: 所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端 。 这样我们就可以自己实现Web框架了。 简易版本的自定义web框架代码: import socket ​ sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() ​ while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close() 总结: 用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定?所以,有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。 HTTP协议 超文本传输协议:规定了客户端与服务端消息传输的格式 四大特性: 1.基于TCP/IP协议作用于应用层的协议 2.基于请求响应 3.无状态 4.无连接 数据格式之请求: 请求首行 请求头(一堆k,v键值对) /r/n 请求体(post请求携带的数据) 数据格式之响应: 响应首行 响应头(一堆k,v键值对) /r/n 响应体(post请求携带的数据)

Python mini web框架

匆匆过客 提交于 2019-11-29 08:31:07
mini web框架-1-文件结构 文件结构 ├── dynamic ---存放py模块 │ └── my_web.py ├── templates ---存放模板文件 │ ├── center.html │ ├── index.html │ ├── location.html │ └── update.html ├── static ---存放静态的资源文件 │ ├── css │ │ ├── bootstrap.min.css │ │ ├── main.css │ │ └── swiper.min.css │ └── js │ ├── a.js │ ├── bootstrap.min.js │ ├── jquery-1.12.4.js │ ├── jquery-1.12.4.min.js │ ├── jquery.animate-colors.js │ ├── jquery.animate-colors-min.js │ ├── jquery.cookie.js │ ├── jquery-ui.min.js │ ├── server.js │ ├── swiper.jquery.min.js │ ├── swiper.min.js │ └── zepto.min.js └── web_server.py ---mini web服务器 my_web.py import time

socket实现ftp文件的上传和下载

一世执手 提交于 2019-11-29 08:27:30
socket实现ftp文件的上传和下载 server端代码: import socket import json import struct import os soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.bind(('127.0.0.1', 8021)) soc.listen(5) # 上传函数 def uploading_file(): while True: try: ftp_dir = r'F:\shpython11\pycharmwork\first_project\study_start\day32\ftp_dir' if not os.path.isdir(ftp_dir): # 这个是作为我们上传了之后的文件放在这个位置,你改成自己本地的 os.mkdir(ftp_dir) head_bytes_len = conn.recv(4) # 拿到struct后的头长度 head_len = struct.unpack('i', head_bytes_len)[0] # 取出真正的头长度 # 拿到真正的头部内容 head_bytes = conn.recv(head_len) # 反序列化后取出头 head = json.loads(head_bytes) file_name = head[

初始django

て烟熏妆下的殇ゞ 提交于 2019-11-29 05:39:43
Web框架本质 https://www.cnblogs.com/liwenzhou/p/8258992.html 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。 import socket sk = socket.socket() sk.bind(("127.0.0.1",8080)) sk.listen() while 1 : conn, _ = sk.accept() data = conn.recv(8096).decode("utf-8") conn.send(b"Http/1.1 200 ok \r\n\r\n") conn.send(b"hello") conn.close() sk.close() 用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定? 你这个网站是这个规定,他那个网站按照他那个规定,这互联网还能玩么? 所以,必须有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。 这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。 HTTP协议主要规定了客户端和服务器之间的通信格式, 我们发现收发的消息需要按照一定的格式来,这里就需要了解一下HTTP协议了。

Broken pipe错误终极解释

好久不见. 提交于 2019-11-29 03:19:51
叙述 想必或多或少在Java的服务器都会遇到过这种异常,如下图 由于Java偏上层,日常开发接触系统底层的机会偏少,要搞清楚什么原因导致的这种异常,肯定是先要百度google一番。 网络解释云里雾里 百度+google下,巴拉巴拉还真不少介绍这个错误的文章。欣喜地翻了一篇又一篇,但好像我依旧不明白具体什么原因导致的,云里雾里啊。好吧,举两个例子: 例子一: 这上边说的好像有点道理,写个代码做个试验验证下吧!直接上代码: //client程序 public static void main(String[] args) { try { Socket s = new Socket(); s.connect(new InetSocketAddress("127.0.0.1",3113)); OutputStream os = s.getOutputStream(); os.write("hello".getBytes()); s.close(); System.in.read();//防止程序退出 }catch (Exception e){ e.printStackTrace(); } } //server程序 public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(3113);

Swoole.001.手撸网络服务器模型

百般思念 提交于 2019-11-28 23:59:55
github: https://github.com/masterzcw/swoole Swoole进程结构 Master进程: 主进程 Manger进程: 管理进程 Worker进程: 工作进程 Task进程: 异步任务工作进程 Master进程 第一层, Master进程, 这个是swoole的主进程,这个进程是用于处理swoole的核心事件驱动的, 那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程], swoole所有对于事件的监听都会在这些线程中实现, 比如来自客户端的连接, 信号处理等. 1.1 MainReactor(主线程) 主线程会负责监听server socket, 如果有新的连接accept, 主线程会评估每个Reactor线程的连接数量. 将此连接分配给连接数最少的reactor线程, 做一个负载均衡. 1.2 、Reactor线程组 Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据完全是异步非阻塞的模式. swoole的主线程在Accept新的连接后, 会将这个连接分配给一个固定的Reactor线程, 在socket可读时读取数据, 并进行协议解析, 将请求投递到Worker进程. 在socket可写时将数据发送给TCP客户端. 1.3、心跳包检测线程(HeartbeatCheck)

day38_步入百万年薪的第三十八天——线程queue、事件event、协程

若如初见. 提交于 2019-11-28 22:57:43
day38 线程queue 多线程抢占资源 只能让其串行——用到互斥锁 线程queue 队列——先进先出(FIFO) import queue q = queue.Queue(3) q.put(1) q.put(2) q.put(3) # q.put(4) # 阻塞等其他进程或者线程来拿 print(q.get()) print(q.get()) print(q.get()) # print(q.get(block=False)) # 没有值就直接报错 # q.get(timeout=2) # 阻塞2s,还没有值直接报错 堆栈——先进后出(LIFO) import queue q = queue.LifoQueue(4) q.put(1) q.put(2) q.put("alex") q.put("太白") print(q.get()) print(q.get()) print(q.get()) print(q.get()) 结果: 太白 alex 2 1 优先级队列——自己设置优先级 import queue q = queue.PriorityQueue(4) q.put((5, "元宝")) q.put((-2, "狗狗")) q.put((0, "2李业")) q.put((0, "1刚哥")) print(q.get()) print(q.get()) print(q

[深入理解Android卷一全文-第四章]深入理解zygote

社会主义新天地 提交于 2019-11-28 20:28:10
由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在OSC博客中全文转发这两本书的全部内容。 第4章 深入理解Zygote 本章主要内容 · 深入分析zygote,并介绍system_server进程的初始化工作。 本章涉及的源代码文件名及位置 下面是我们本章分析的源码文件名及其位置。 · App_main.cpp framework/base/cmds/app_process/App_main.cpp · AndroidRuntime.h framework/base/include/android_runtime/AndroidRuntime.h · android_debug_JNITest.cpp framework/base/core/jni/android_debug_JNITest.cpp · ZygoteInit.java framework/base/core/java/com/android/internal/os/ZygoteInit.java · dalvik_system_Zygote.c dalvik/vm/native/dalvik_system_Zygote.c · RuntimeInit.java framework/base/core/java/com/android

并发编程:协程

瘦欲@ 提交于 2019-11-28 20:18:17
一 引子   基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此需要先看下并发的本质:切换+保存状态 ​ cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它   协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在自己的程序里面来控制任务的切换。     ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态   一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 import time def func1(): for i in range(11