socket

26.python网络编程

不打扰是莪最后的温柔 提交于 2020-01-19 00:04:50
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好。 但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。 二.软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构 1.C/S架构 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。 2.B/S架构 B/S即:Browser与Server,中文意思

java BIO(阻塞IO,即传统IO)分析

核能气质少年 提交于 2020-01-18 22:33:02
对于java 传统的BIO来说,究竟存在哪些缺点呢? 首先需要理解的是,对于传统的java io来说,总体上是一个连接一个线程,都会说这样的服务器处理方式效率不高而且浪费资源,那么究竟是怎么回事儿呢? 源码地址:https://github.com/50mengzhu/learnIo 解读一下BIO的流程—— 首先由服务器端开启一个Socket监听固定端口,等待客户端连接 等到和客户端线程建立连接,从连接中的数据流中等待读取数据 客户端下线之后,服务器的线程随之终止 package com.dx.bio; import static com.dx.io.NetConstants.NET_BUFFER; import static com.dx.io.NetConstants.SERVER_PORT; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingDeque;

MySQL入门

时间秒杀一切 提交于 2020-01-18 19:31:35
一 安装、mysql官方文档下载tar.gz包 解压至/use/local下面软连接成mysql oldguo 10:15:53 5.1 解压处理 [root@db01 local]# tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz [root@db01 local]# ln -s mysql-5.7.26-linux-glibc2.12-x86_64 mysql 5.2 建数据目录 [root@db01 local]# mkdir -p /data/mysql/data [root@db01 local]# mkdir -p /data/mysql/binlog 5.3 建用户 [root@db01 local]# userdel -r mysql [root@db01 local]# useradd -s /sbin/nologin mysql oldguo 10:17:23 5.4 处理遗留的mariadb [root@db01 local]# yum remove mariadb* oldguo 10:18:14 5.5 授权 [root@db01 local]# chown -R mysql.mysql /data /usr/local/mysql* oldguo 10:19:30 export PATH=/usr

网络嗅探

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-18 14:35:46
网络嗅探 嗅探目标:基于UDP发现目标网络存活的主机 嗅探基础:当发送一个UDP数据包到主机上的某个关闭端口时,目标主机返回ICMP包指示目标端口不可达,证明目标主机存活,否则证明目标主机不存在 import socket import os import struct import threading import time #导入netaddr包处理子网ip地址 from netaddr import IPNetwork,IPAdress from ctypes import * #扫描主机号 host="192.168.65.133" #扫描子网号 subnet="192.168.65.0/24" magic_message="PYTHONRULES" def udp_sender(subnet,magic_message): time.sleep(5) sender=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) for ip in IPNetwork(subnet): try: #发送数据到子网内所有主机 sender.sendto(magic_message,("%s" % ip,65212)) except: pass #对Ip数据报报头进行解析 class IP(Structure): _fields_=[ ("ihl

域名到IP 报错socket.gaierror: [Errno 8] nodename nor servname provided, or not known

无人久伴 提交于 2020-01-18 09:55:42
Python中如何通过域名,查看对应的IP? 请看如下代码: import socket hostname="www.baidu.com" ip = socket.gethostbyname(hostname) print "ip:", ip 看下执行结果: ip: 112.80.248.75 如果配置的hostname有问题,或者说域名配置错误,就会出现如下报错: Traceback (most recent call last): File "t.py", line 5, in <module> ip = socket.gethostbyname(hostname) socket.gaierror: [Errno 8] nodename nor servname provided, or not known 来源: https://www.cnblogs.com/lanyangsh/p/11487115.html

epoll 模板

一笑奈何 提交于 2020-01-18 08:10:45
select 的问题: 1.当进程被唤醒不清楚到底哪个socket有数据,只能遍历一遍 2.每一次select的执行,都需要将这进程,再加入到等待队列中 ​ 为了防止重复添加等待队列,当某一次操作完成时,也必须从等待队列中删除进程 所以select最大限制被设置为了1024 ,如此看来select连多线程都比不上 于是推出了poll 和 epoll poll只是简单对select进行了优化,但是还不够完美 ,epoll才是最后的解决方案 注意:epoll仅能在linux中使用 案例: import socket import select s = socket.socket() s.bind(("127.0.0.1",1689)) s.listen() # 创建一个epoll对象 epoll = select.epoll() # 注册读就绪事件 (有数据可以读取了) # s.fileno()用于获取文件描述符 epoll.register(s.fileno(),select.EPOLLIN) # 存储文件描述符与socket的对应关系 fd_sockets = {s.fileno():s} while True: # 该函数是阻塞会直到你关注的事件发生 # 返回值为文件描述符与发生的事件类型 是一个列表 列表中是元组 第一个是描述符 第二个是事件 for fd,event in

python实现socket通信

半城伤御伤魂 提交于 2020-01-18 08:01:44
python实现socket很简单,保证你的环境有响应的python环境就可以,我使用的是socket,demo代码如下: server端程序: 1 # coding:utf-8 2 3 import socket # 导入 socket 模块 4 5 6 def test_server(): 7 s = socket.socket() # 创建 socket 对象 8 9 host = socket.gethostname() # 获取本地主机名 10 port = 12345 # 设置端口 11 addr = (host, port) # 设置地址tuple 12 s.bind(addr) # 绑定端口 13 14 s.listen(10) # 等待客户端连接 15 while True: 16 c, addr = s.accept() # 接收客户端的连接 17 print '连接地址:', addr 18 c.send('this is a test!') 19 c.close() # 关闭连接 client端程序: 1 # coding:utf-8 2 3 import socket # 导入 socket 模块 4 5 def test_client(): 6 s = socket.socket() # 创建 socket 对象 7 host = socket

关于TCP的状态机

折月煮酒 提交于 2020-01-18 05:24:23
http://www.2cto.com/net/201111/112030.html 另外: 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口 状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢? 有没有什么情况使主动关闭的socket直接进入CLOSED状态呢? 主动关闭的一方在发送最后一个 ack 后 就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间 这个是TCP/IP必不可少的,也就是“解决”不了的。 也就是TCP/IP设计者本来是这么设计的 主要有两个原因 1。防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发 fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以 主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。 TIME_WAIT 并不会占用很大资源的,除非受到攻击。 还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态 来源: https://www.cnblogs.com/shalk/archive/2012/10

Socket读写数据流程

女生的网名这么多〃 提交于 2020-01-18 05:15:48
当客户端和服务器使用TCP协议进行通信时,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接字socket将字节数组发送到服务器,服务器通过套接字socket读取到字节数组,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对应res,将响应对象res序列化成字节数组,然后通过套接字将字节数组发送给客户端,客户端通过套接字socket读取到字节数组,再反序列化成响应对象。 通信框架往往可以将序列化的过程隐藏起来,我们所看到的现象就是上图所示,请求对象req和响应对象res在客户端和服务器之间跑来跑去。 也许你觉得这个过程还是挺简单的,很好理解,但是实际上背后发生的一系列事件超出了你们中大多数人的想象。通信的真实过程要比上面的这张图复杂太多。你也许会问,我们需要了解的那么深入么,直接拿来用不就可以了么? 在互联网技术服务行业工作多年的经验告诉我,如果你对底层机制不了解,你就会不明白为什么对套接字socket的读写会出现各种奇奇乖乖的问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题,NIO具体又是什么,它是什么特别新鲜的技术么?对于这些问题的理解都需要你了解底层机制。 5、Socket读写的细节过程分析 为了方便大家对通信底层的理解,我花了些时间做了下面这个动画,它并不能完全覆盖底层细节的全貌

unix domain socket的性能测试

百般思念 提交于 2020-01-18 02:42:02
背景说明 最近在做的一个项目,底层是用以前C写的语音交换能力,由于语音的应用需要对流进行处理,这边为了对接网络或者应用方便,想把流桥接出来,在能力层上面封装一层业务,同时又不想影响以前的流程。 所以一直在考虑进程内通信的问题,组件的话本身以前一直用event socket lib开发也没什么问题,但是之前都是用来做信令控制而已,负载并不高。 这次桥接的语音流初步目标是1000路并发,最少的8K采1000路就是每秒8m,就算单路每秒发25次数据,每次320字节,那每秒网卡那边中断次数也是2w+,这个对并发是一个巨大的挑战。 之前event socket lib开发虽然也是对接1000路,但是总归每秒的请求也就平均一个上下,而且数据量小。 这次我想反正这两个组件暂时不会分开,干脆就进程间通信好了。消息队列共享内存什么的我就不考虑了,因为我写东西比较习惯抽象的接口,考虑到后面流更大了后,微服务模块可能会开发一个强大的硬解模块来解决,也希望兼容网络通信的写法,所以选定了unix domain socket,毕竟接口和写net socket没什么区别。 unix domain socket相对网络通信用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC 机制本质上是可靠的通讯