我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python基础:网络编程socket基

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python基础:网络编程socket基

socket也叫套接字,是对各种协议的封装,实现收发数据。


Python里socket工作过程:(图片来自网络)

d000baa1cd11728b45647b06cafcc3cec3fd2c4c.jpg


socket在Python中实际上是一个模块,实现发送和接收数据的功能。


因为socket是一个类,所以只导入模块需要使用socket.socket()创建一个socket对象。


  • 创建一个socket格式:

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

参数名选项名称作用
familyAF_UNIX
unix系统进程间传输数据
AF_INETIPv4网络传输数据
AF_INET6IPv6网络传输数据
typeSOCK_STREAM
流式数据,TCP

SOCK_DGRAM数据报式数据,UDP

SOCK_RAW
原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

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

SOCK_SEQPACKET
连续的数据包传输(已废弃)
proto
0默认是0,根据地址簇和套接类别自动选择合适的协议
fileno默认是None
If fileno is specified, the other arguments are ignored, causing the socket with the specified file descriptor to return. Unlike socket.fromfd(), fileno will return the same socket and not a duplicate. This may help close a detached socket using socket.close().



  • socket对象的方法:

    1、socket分为服务端和客户端。

    2、TCP传输不需要IP,UDP传输需要IP地址。

    3、socket传输字符串需要变成byte型。

    4、列表、字典等数据也需要成变byte型。json处理过的数据是字符型的,decode后可以进行send。

    5、传输大数据,使用长度时,要注意len的对象是原数据,还是encode后的数据,接收方也得计算相应的数据。否则会造成文件长度不匹配


方法名对象作用
bind(地址)
服务端绑定服务端地址,IPv4下,是元组的形式(地址,端口)
listen(backlog)服务端设定客户端连接数量,数字
accept()服务端

完整的接收信息:

(<socket.socket fd=316, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6666), raddr=('127.0.0.1', 58775)>, ('127.0.0.1', 58775))

<>部分是套接字信息

后面元组是客端地址。

connect(地址)客户端绑定服务端地址,IPv4下,是元组的形式(地址,端口)
connect_ex()客户端功能与connect相同,但是成功返回0,失败返回errno的值。
s.recv(bufsize[,flag])服务和客户端

接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。

bufsize官方建议8192,不同系统最大数值不同,一般一次可以收10M左右。

s.send(string[,flag])发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall(string[,flag])

完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

s.recvfrom(bufsize[.flag])接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto(string[,flag],address)发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字。
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )
sk.fileno()套接字的文件描述符


  • 服务端连接实例:

import socket

server = socket.socket()
server.bind("localhost",6666)   # localhost是本地主机,也可以写172.0.0.1
server.listen(6)                # 同时允许5个客户端

while True:                     # 此位置的while是为了客户端结束后,再等待其它客户端进入。
    conn,addr = server.accept() # 接收一套接字信息,和地址。对应的是客户端的connect
    
    while True:
        conn.recv(1024)         # 服务端先接收数据,可以改变每次接收的数值,但是不要小于客户端发送的值。
        conn.send(b'00000')              # 字符前面加r,变成字节数据,才可以传输
        # 这里就是互相通信的主体,可以有多个recv和send,需要注意的是,一收一发,要和客户端对应
        # 服务端和客户端不能同时收或同时发。
        
                break                            # 结束此客户端,继续listen其它客户端


  • 客户端连接实例:

import socket

client = socket.socket()                        # 创建套接字对象
client.connect(('localhost',6666))              # 连接的主机名和端 口,也可以是字符串的ip地址  "127.0.0.1"
while True:
    client.send(b'11111')
    client.recv(1024)
    # 这里就是互相通信的主体,可以有多个recv和send,需要注意的是,一收一发,要和客户端对应
    break

client.close()                                  # 客户端关闭连接。


  • 简单FTP制作的问题点

json.decoder.JSONDecodeError: Extra data: 

因为传输的过程中有二进制数据,所以json无法decode。


传输文件完成时怎么返回?

客户端都一收一发。并且在传输个列表,第一项是标志,第二项是True,当两项不匹配时,提示错误,并返回选项列表。



有时候服务器运行程序时间长,没有到接收语句,而客户端发送数据太快,导致出错

在客户端加个sleep...



logging使用filehandler中文乱码

创建filehandler时,写入encode参数

file_handler = logging.FileHandler(log_path,encoding='utf-8')


调用logging模块,重复输出

1、使用removeHandler()把这个logger里的handler移除掉

2、在log方法里做判断,如果这个logger已有handler,则不再添加handler。


字典、列表无法传输

使用json序列化后传输。json序列化后原来是字节的!


“粘包”:A给B连续发送两个send,B接收到的两个数据都混在一起,分不清第一次还是第二次接收的

原因是,A发送时存在缓存区,大约0.5S后缓存消失

如果想要分开两次的数据,A使用send后立即执行recv,接收B的send,然后再发送第二句。

            '''更好的解决粘包'''
            # recv_file_size 已经接收的大小
            # file_size      文件总大小
            # base_recv      每次接收的大小
            base_recv = 1024
            recv_file_size = 0
            while recv_file_size<file_size:

                data = conn.recv(base_recv).decode()
                if file_size-recv_file_size < base_recv:
                    base_recv = file_size-recv_file_size
                recv_file_size =+ len(data)


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python基础:网络编程socket基

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python基础:网络编程socket基

socket也叫套接字,是对各种协议的封装,实现收发数据。Python里socket工作过程:(图片来自网络)socket在Python中实际上是一个模块,实现发送和接收数据的功能。因为socket是一个类,所以只导入模块需要使用socke
2023-01-31

Socket 编程基础

文章目录 一、socket 简介二、socket 编程接口介绍1. socket()函数2. bind()函数3. listen()函数4. accept()函数5. connect()函数6. 发送和接收函数read()函数rec
2023-08-18

Python基础:网络编程sockets

socketserver此模块简化了socket的编写。    1、它有一个基类,定义了如何建立连接。BaseServer提供了服务类接口,BaseServer使用了select创建了多线程。BaseServer下面有四个类:TCPServ
2023-01-31

python编程之网络基础

1 套接字是一种具有通讯端点概念的计算机网络数据结构,网络化的应用程序在开始任何通讯之前都必须要建立套接字。套接字起源于20世纪70年代,有时人们把套接字成为“伯克利套接字”或“BSD套接字”,期初,套接字被设计用在同一台主机上多个应用程序
2023-01-31

《Python网络编程基础》笔记

python网络编程基础                          ==================Author: lujun9972 Date: 2013-03-08 22:29:20 CSTTa
2023-01-31

Java 网络编程基础

文章目录 前言什么是网络编程网络编程基础知识网络通讯流程长连接和短连接Socket Java 网络编程总结 前言 一个网络请求、服务之间的调用都需要进行网络通讯,在日常开发时我们可能并不会关心我们的服务端是怎么接收到请求的、
2023-08-16

从零开始学Python第八周:详解网络编程基础(socket)

一,Socket编程 (1)Socket方法介绍Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接“,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。套接字是一个双向的通
2022-06-04

网络安全编程:Winsock编程基础

网络攻防是一个比较大的话题,比如端口扫描、SQL Injection扫描、数据包嗅探、网络密码猜解、后门、木马等知识的基础技术。这些技术在入侵剖析中是比较常见的技术。

Python中基础的socket编程实战攻略

在网络通信中socket几乎无处不在,它可以看成是应用层与TCP/IP协议簇通信的中间软件抽象层,是两个应用程序彼此进行通信的接口,并且把复杂的TCP/IP协议细节隐藏在接口之后。Python提供了socket模块,可以非常方便的进行soc
2022-06-04

Python 网络编程的七个基础概念

今天我们学习了 Python 网络编程的七个基础概念,通过这些概念,我们能够更好地理解和编写网络应用程序。

python网络编程-socket编程

一、服务端和客户端BS架构 (腾讯通软件:server+client)CS架构 (web网站) C/S架构与socket的关系:我们学习socket就是为了完成C/S架构的开发 二、OSI七层模型互联网协议按照功能不同分为osi七层或tcp
2023-01-31

Python—网络编程Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据
2023-01-31

python网络编程--socket

1.服务端1.1声明socket对象server=socket.socket(AF.INET,socket.SOCK_STREAM)1.2绑定ip、端口server.bind(localhost,6969)1.3开始监听server.lis
2023-01-31

python的网络编程基础知识有哪些

这篇“python的网络编程基础知识有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python的网络编程基础知识有哪些
2023-06-26

Python学习 :socket基础

socket基础  什么是socket?  - socket为接口通道,内部封装了IP地址、端口、协议等信息;我们可以看作是以前的通过电话机拨号上网的年代,socket即为电话线  socket通信流程  我们通过下面的图来了解socket
2023-01-31

Netty网络编程零基础入门

Netty是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端,如果你还不了解它的使用,就赶快继续往下看吧
2022-11-13

Python 编程基础

数据类型None 值整型浮点型布尔类型 True,False字符串元组 tuple(),有序,不可变例: t1 = (1,)  t2 = (1,'Hello',1.0,True)列表 list[],有序,可变例: l = [1,'He
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录