sockket简介

socekt又称为‘套接字’,用于描述IP和地址端口,是一个通信链路的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求。

socket起源于Unix,所以也遵从“一切皆文件”的基本哲学,对于文件,进行打开/读取/关闭的操作模式。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。

socket和file文件的区别:

  • file模块是针对指定文件进行打开、读写、关闭操作。
  • socket模块是针对服务器和客户端socket进行打开、读写、关闭操作。

Socket对象

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

参数一:地址簇

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

参数一:地址簇

参数 描述
socket.AF_INET IPv4(默认)
socket.AF_INET6 IPv6
ocket.AF_UNIX 只能够用于单一的Unix系统进程间通信

参数二:类型

参数 描述
socket.SOCK_STREAM 流式socket , for TCP (默认)
socket.SOCK_DGRAM 数据报式socket , for UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
socket.SOCK_SEQPACKET 可靠的连续数据包服务

Socket类方法

方法 描述
s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。
sk.listen(backlog) 开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
sk.setblocking(bool) 是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
sk.accept() 接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
sk.connect(address) 连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
sk.connect_ex(address) 同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061
sk.close() 关闭套接字连接
sk.recv(bufsize[,flag]) 接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
sk.recvfrom(bufsize[.flag]) 与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
sk.send(string[,flag]) 将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。
sk.sendall(string[,flag]) 将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。内部通过递归调用send,将所有内容发送出去。
sk.sendto(string[,flag],address) 将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。
sk.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。
sk.getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
sk.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port)
sk.fileno() 套接字的文件描述符

socket编程思路

  • TCP服务端
  1. 创建套接字,绑定套接字到本地IP与端口
  2. 开始监听连接
  3. 进入循环,不断接受客户端的连接请求
  4. 然后接收传来的数据,并发送给对方数据
  5. 传输完毕后,关闭套接字
  • TCP客户端
  1. 创建套接字,连接远端地址
  2. 连接后发送数据和接收数据
  3. 传输完毕后,关闭套接字

server端:

import socket
ip_port = ('127.0.0.1',9999)
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
sk.bind(ip_port)while True:data = sk.recv(1024)print(data.decode())

client端:

import socket
ip_port = ('127.0.0.1',9999)sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
while True:inp = input('数据:').strip()if inp == 'exit':breaksk.sendto(bytes(inp,encoding='utf8'),ip_port)sk.close()

socket粘包问题

sk.recv(1024)中,bufsize值为1024,最多只能接受1024个字节,那么如果client端发送的数据包特别大时,超过了指定的bufsize的值,超过的不分会留在内核缓冲区中,下次调用recv的时候会继续读剩余的字节。这就是所谓的粘包问题,那么怎么解决呢?

类似于http协议,我们可以:

  1. 在发送之前先告诉接受数据端我要发送数据的字节大小
  2. 接收数据端收到数据后回复给数据发送端一个确认消息
  3. 数据发送端收到确认信息后,发送数据
  4. 数据接收端循环接受数据,直到数据接受完成,收到完整数据包

client端:

import socket
ip_port=('127.0.0.1',9999)s=socket.socket()s.connect(ip_port)while True:send_data=input('>>:').strip()if send_data=='exit':breakif len(send_data)==0:continues.send(bytes(send_data,encoding='utf8'))ready_tag=s.recv(1024)ready_tag=str(ready_tag,encoding='utf8')if ready_tag.startswith('Ready'):msg_size=int(ready_tag.split('|')[-1])print(msg_size)start_tag='Start's.send(bytes(start_tag,encoding='utf8'))recv_size=0recv_msg=b''while recv_size < msg_size:recv_data=s.recv(1024)recv_msg+=recv_datarecv_size+=len(recv_data)print(str(recv_msg,encoding='utf8'))s.close()

server端:

import socket,subprocess
ip_port=('127.0.0.1',9999)s=socket.socket()s.bind(ip_port)s.listen(5)while True:conn,addr=s.accept()while True:try:recv_data=conn.recv(1024)if recv_data==0:breakp=subprocess.Popen(str(recv_data,encoding='utf8'),shell=True,stdout=subprocess.PIPE)res=p.stdout.read()if len(res)==0:send_data='cmd ERROR'send_data=bytes(send_data,encoding='utf8')else:send_data=resready_tag='Ready|%s'%len(send_data)conn.send(bytes(ready_tag,encoding='utf8'))feedback=conn.recv(1024)feedback=str(feedback,encoding='utf8')if feedback.startswith('Start'):conn.send(send_data)except Exception as ex:breakconn.close()

转载于:https://www.cnblogs.com/xscq/p/10113442.html

python资源库——socket网络编程相关推荐

  1. python 之socket 网络编程

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  2. Python: Socket网络编程,多线程处理小Demo

    一个简单的例子,深入研究一下socket的多线程处理任务 Server端: #!/usr/bin/env python #encoding:utf8 # # 注意:定义encoding时必须在第二行i ...

  3. Python的socket网络编程(一)

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 先写首诗,抒抒情. 一. 食堂.校园 见过你那么多次 卑微的我 只敢偷偷瞄上一眼 心扑通 扑通 春天真好 不是么 二. 学子 ...

  4. 五 Python之socket网络编程

    <1>socket概念 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应 ...

  5. python运维开发之socket网络编程01

    python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...

  6. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  7. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  8. python网络编程讲解_详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  9. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信

    目录 前言 IP地址 简介 公有IP 私有IP 局域网之间网络通信 前提 功能描述 源码 运行结果 局域网与广域网网络通信 前提 源码 结语 前言 本系列博客是笔者学习Python Socket的过程 ...

最新文章

  1. 傅里叶变换的初级理解一
  2. sap gateway development mode
  3. oppo r11 android版本,OPPO R11手机一共有几个版本?各版本都有哪些区别?
  4. 4 文件操作 支持图片 视频 mp3 文本等
  5. Hive-Based Registry使用
  6. 读取24位ad的值_实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值
  7. 语法推导树之短语,直接短语,句柄
  8. 着色器的细节层次技术 Shader Level of Detail
  9. 固态函数不正确_固态硬盘可靠吗?
  10. 【老生谈算法】matlab实现免疫算法源码——免疫算法
  11. WinAPI之ReleaseSemaphore
  12. 解决仙剑奇侠传“应用程序无法正常启动(0xc000000d)”的问题【转载】
  13. IPC Send timeout detected模拟和总结
  14. vue组件开发之仿CSDN发布博客时面包屑标签和checkbox选中效果
  15. SwiftUI 使用Apple Visionkit构建文档扫描仪
  16. SCCM部署系统任务序列失败错误代码0x80070002
  17. 怎么改锁定计算机的背景,电脑修改登录界面背景壁纸的操作方法
  18. 记一次对Pixiv日榜的爬虫
  19. 什么软件可以测试自己的穿衣,心理测试:4个女孩,哪个穿衣风格跟你最像?秒测你的真实性格...
  20. 以EOF结束输入 PTA 7-12 排序(数组)

热门文章

  1. 前端开发必看 | Vue在前端市场这么火,它到底是什么?
  2. 做web前端的小伙伴注意了,未来这些发展方向可以试试!
  3. 关于前端开发,你真的了解吗?
  4. sql max同一行_超经典SQL题 | 做完这4道面试题你就过关了
  5. C语言常用8种排序方法耗时测试
  6. NYOJ-邮票分你一半(dp)
  7. pytorch加载之前训练模型中的部分参数以及冻结部分参数(实测,自己实际项目代码中的)
  8. 虹膜归一化:仿射——图解仿射变换的旋转矩阵推导
  9. 纪录安装tensorflow的又一次的坑
  10. 2018.9.18opencv3.4.1 + vs 2017 community +win 10 x64+cmake 3.11.3终终终章!