python套接字socket通信


Posted in Python onApril 01, 2022

一、初步认识

socket被翻译成套接字,尽管有些人诟病,但我觉得还挺贴切的。其功能是提供低级别的网络服务,最常用的就是根据IP来传输数据。

所谓传输,就要有两个“端”,首先做一个服务端

import socket
s = socket.socket()
host = socket.gethostname() #本机地址   
port = 12345                #端口
s.bind((host,port))         #绑定端口
s.listen(3)     #开始监听,最多支持三个链接
while True:
    c, addr = s.accept()    #等待连接
    print("Linked @ Addr",addr)
    break

#下面为发送命令
while True:
    data = input("input data:")
    c.send(data.encode("utf8"))
    if data=="exit":
        c.close()
        break

需要注意的是,send需要发送的内容是二进制码,故而通过encodedecode来编解码。最后如果输入exit则退出。

然后写一个客户端

import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host,port))
while True:
    data = s.recv(1024).decode("utf8")
    if data!=b'':
        print("receive data:", data)
    # 当接收到exit时关闭端口,退出循环
    if data[:4]=="exit":
        s.close()
        break

运行之后,服务端和客户端的输入输出分别为

#服务端
Linked @ Addr ('192.168.1.113', 9953)
input data:hello world
11
input data:who are you
11
input data:can u speak chinese?
20
input data:exit

#客户端
receive data: hello world
receive data: who are you
receive data: can u speak chinese?
receive data: exit

二、socket对象

在上例中,通过socket.socket创建了一个socket对象,其完整的构造函数为

socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)

其中,family表示套接字的地址族,主要包括三类

地址族 AF_INET AF_INET6 AF_UNIX
协议来源 IPv4 IPv6 UNIX

在创建串口时,可以通过或运算|同时选择多个地址族。

type为套接字类型,比较常用的有两种:

  • SOCK_STREAM,为流式套接字,特点是传输与接收顺序相同,安全。
  • SOCK_DGRAM,为数据报格式套接字,特点是快、无顺序、可能丢失

proto为协议号,一般为0,当协议族为AF_CAN时,协议应为CAN_RAW, CAN_BCM, CAN_ISOTPCAN_J1939

fileno代表一个创建socket的文件。

尽管构造函数并无声明客户端与服务端的参数,但从功能来看,二者所能够调用的成员应该并不完全相同。

其中,bind,listen,accept这三个方法为服务端的专有方法,其功能分别为

  • bind(address):将其绑定到某个地址,其中地址address一般为一个元组,包括IP和端口号
  • listen(N):启动一个服务器用于接受连接,N为最多连接个数,不小于0。
  • accept():接受一个连接,无参数,返回值是(conn, address)元组,conn是一个新的socket对象,用于收发数据。

相应地,客户端也有两个专用的方法:

  • connect(address):连接某个地址。
  • connect_ex(address):和connect相比,当出现错误时返回错误码,而不报错。

接下来是客户端和服务端均可使用的方法,其中最关键的就是发送send和接收recv。

其中,与发送相关的函数有:

  • send(bytes):其中bytes为发送字节,返回已发送的字节(有的时候可能并没有发完)。
  • sendall(bytes):和send相比,会持续发送bytes,直到所有数据都已发送或者报错。
  • sendfile(file,offset=0,count=None):在Unix下发送文件,在Windows下和send相同,相当于是不可用的。
  • sendto(bytes,addresss):指定地址发送数据。

在Windows中可用的接收相关函数有两组,其中bufsize表示接收数据的最大字节数。

  返回数据 返回数据+接收端地址
不写入缓冲区 recv(bufsize) recvfrom(bufsize)
写入缓冲区buf recv_into(buf,bufsize) recvfrom_into(buf,bufsize)

get-set是很多模块中都会出现的函数名称,前者代表获取某种参数,后者代表设置某些参数,一般后者的输入为前者的输出。

python套接字socket通信

套接字中止或者关闭的方法有下面几种:

  • close()关闭套接字的文件描述符
  • detach()关闭套接字对象,但并不关闭文件描述符

shutdown(how)可以部分关闭套接字的连接,其中how为:

  • SHUT_RD:后续不再允许接收
  • SHUT_WR:后续不再允许发送
  • SHUT_RDWR:后续的发送和接收都不允许

 到此这篇关于python套接字socket通信的文章就介绍到这了,更多相关python  socket通信内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python可变参数用法实例分析
Apr 02 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Python中的引用知识点总结
May 20 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
python文件与路径操作神器 pathlib
Python下载商品数据并连接数据库且保存数据
Python turtle编写简单的球类小游戏
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 #Python
Pandas数据结构之Series的使用
Mar 31 #Python
python获取字符串中的email
Mar 31 #Python
Python利用FlashText算法实现替换字符串
You might like
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
介绍php设计模式中的工厂模式
2008/06/12 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
js option删除代码集合
2008/11/12 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python爬取哈尔滨天气信息
2018/07/14 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
护士求职推荐信范文
2013/11/23 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书