学习python必知的socket知识

ocket基础

写个自己的一句话,记得在封装传递的时候用上getattr等

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

Socket技术起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket和file的区别:

file模块是针对某个指定文件进行【打开】【读写】【关闭】

socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

socket参数详解

实例化socket对象


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) # 实例化socket对象

参数一:地址簇

socket.AF_INET IPv4(默认)

socket.AF_INET6 IPv6

socket.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报文;<br> 此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。<br> SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

socket.SOCK_SEQPACKET 可靠的连续数据包服务

参数三:协议

0 (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议

socket对象的方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31


sk.bind(address)         将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。

sk.listen(backlog)       开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。 backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5, 这个值不能无限大,因为要在内核中维护连接队列

sk.setblocking(bool)     是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。

sk.accept()              接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来

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表示没有超时期。<br> 一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

sk.getpeername()         返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。

sk.getsockname()        返回套接字自己的地址。通常是一个元组(ipaddr,port)

sk.fileno()             套接字的文件描述符

一个简单的socket服务端和客户端

socket服务端

 

socket客户端

 

使服务端和客户端能够循环收发信息,上面的代码只能够相互发送一次数据,在原始的代码基础之上进行改良

 服务端

 客户端

客户端可以退出

当客户端输入“exit“时,客户端和服务器端都能够退出,上面的代码实现了客户端和服务端循环收发数据,但是客户端不能够退出,现在要加一个功能

 服务端

 客户端

多用户

上面的功能实现了客户端输入exit然后客户端和服务器都退出,但是到目前为止,服务器端只能够服务一个客户端,这个时候新的需求要求服务端可以服务多个客户端同时连接。(测试的时候同时开多个客户端进行测试)

 服务端

 客户端

socket之执行远程命令

根据socket客户端输入的命令,在服务端系统中执行该命令,将执行系统命令返回的数据返回给客户端

 服务端

 客户端

socket粘包处理

当socket服务端给客户端发送的数据大小大于socket接收的大小的时候,就会出现黏包,通过下面代码可以解决粘包的问题

 服务端

 客户端

socket多并发

 服务端

 客户端

socket多并发之执行服务器命令

 服务端

 客户端

原文来自:博客园/沐禹辰

时间: 2024-11-05 12:27:31

学习python必知的socket知识的相关文章

python表达式操作符【学习python必知必会】

运算符 描述 实例 yield x 生成器函数发送协议   lambda args: expression 生成匿名函数   x if y else z 三元选择表达式(c系列有的 python也要有) >>> True if 1>0 else False True 下面的内容摘自菜鸟教程:http://www.runoob.com/python/python-operators.html 人家做的还是不错的,不过上面这个没有写 Python算术运算符 以下假设变量a为10,变量b

学习Python必看入门教程

Python是一种很美丽的语言,现在越来越多的人想要入门Python,所以这里给大家总结了入门Python必知的知识. 什么是Python? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言等等. 那Python是一种什么语言? 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算

mysql学习--mysql必知必会1

?? 例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式处理. (.)是正則表達式的一个符号,表示匹配随意一个字符: mysql> select prod_name -> from products -> where prod_name regexp '.000' -> order by prod_name; +--------------

mysql学习--mysql必知必会

上图为数据库操作分类: 以下的操作参考(mysql必知必会) 创建数据库 执行脚本建表: mysql> create database mytest; Query OK, 1 row affected (0.07 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | mytest | | performan

python必知必会

列了下python中常见内容,适合初学者. 一.名空间 按照LEGB方式寻找名字 首先会在local中寻找 L:local, 函数内部名空间 除非使用global.nolocal关键字特别声明,在def或者lambda的函数的形参和内部变量都存储在locals中 终端样例: >>> answer = 'tell me' >>> def foo(): ... answer = '42' ... print answer ... >>> foo() 42

新手必知linux基础知识

1.用颜色代表不同文件 白色:普通文件 红色:压缩文件 蓝色:目录文件 浅蓝色:链接文件 ***:设备文件(/dev) 绿色:可执行文件(/bin./sbin) 粉红色:图片文件 2.目录代表意义 符号 意义 . 当前工作目录 .. 父目录 ~ 用户家目录 - 上个工作目录 3.linux的目录结构 目录 说明 / Linux文件系统的入口,也是处于最高一级的目录 /bin 基本系统所需要的命令.功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令 /boot 内核

winform和wpf里必知的多线程知识

背景: 很多小伙伴经常在群里问线程的问题,平时我经常转一些视频教程这些人不看,我就自己写个总结吧 不过还是要注意的是,切换本来就不能太频繁,要一口气改. wpf的viewmodel就不需要UI线程,更新更方便. 一,开启一个新的任务 var param = 123; //net4.5以后 Task.Run(() => { DoSomthing(param); }); Task.Run(async () => { await DoSomthingAsync(param); }); //net 4

[Python学习] 专题一.函数的基础知识

        最近才开始学习Python语言,但就发现了它很多优势(如语言简洁.网络爬虫方面深有体会).我主要是通过<Python基础教程>和"51CTO学院 智普教育的python视频"学习,在看视频中老师讲述函数知识的时候觉得非常不错,所以就写了第一篇Python学习的文章分享给大家.主要内容:         1.Python安装与基本输入输出,print()函数和raw_input()函数简单用法. 2.我根据视频中学到的知识,讲解函数的基本知识: (1).系统提

《SQL必知必会》学习笔记(一)

<SQL必知必会>学习笔记(一) 下面变列出我新学到的知识. 这个是数据库的全部记录 1.order by   语句: select * from Scores order by name , Score desc 执行结果: ①order by在执行排序功能时,会先对排序字段按abcd这样的顺序进行,汉字的话是按拼音的首字母,默认是正序. ②例子中先按name字段进行正序排序,当name相同时,又按score倒叙排,例如拜仁两条数据,胜的开头字母是s,负的是f,因为是倒叙,所以胜的那条数据排