python网络编程—socket套接字编程(tcp)(代码片段)

maplethefox maplethefox     2022-12-17     347

关键词:

套接字介绍

1.套接字 : 实现网络编程进行数据传输的一种技术手段

2.Python实现套接字编程:import socket

3.套接字分类

  • 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案。(面向连接--tcp协议--可靠的--流式套接字)
  • 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。(无连接--udp协议--不可靠--数据报套接字)

tcp套接字

服务端流程

技术图片

1.创建套接字

sockfd=socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)

  • 功能:创建套接字
  • 参数: socket_family 网络地址类型 AF_INET表示ipv4
  •     socket_type 套接字类型 SOCK_STREAM(流式) SOCK_DGRAM(数据报)
  •     proto 通常为0 选择子协议
  • 返回值: 套接字对象

2.绑定地址

本地地址 : ‘localhost‘ , ‘127.0.0.1‘
网络地址 : ‘172.40.91.185‘
自动获取地址: ‘0.0.0.0‘

sockfd.bind(addr)

  • 功能: 绑定本机网络地址
  • 参数: 二元元组 (ip,port) (‘0.0.0.0‘,8888)

技术图片

3.设置监听

sockfd.listen(n)

  • 功能 : 将套接字设置为监听套接字,确定监听队列大小
  • 参数 : 监听队列大小

4.等待处理客户端连接请求

connfd,addr = sockfd.accept()

  • 功能: 阻塞等待处理客户端请求
  • 返回值: connfd 客户端连接套接字
  •     addr 连接的客户端地址

5.消息收发

data = connfd.recv(buffersize)

  • 功能 : 接受客户端消息
  • 参数 :每次最多接收消息的大小
  • 返回值: 接收到的内容

n = connfd.send(data)

  • 功能 : 发送消息
  • 参数 :要发送的内容 bytes格式
  • 返回值: 发送的字节数

6.关闭套接字

sockfd.close()

  • 功能:关闭套接字
技术图片tcp服务端流程

客户端流程

技术图片

1.创建套接字

注意:只有相同类型的套接字才能进行通信

2.请求连接

sockfd.connect(server_addr)

  • 功能:连接服务器
  • 参数:元组 服务器地址

3.收发消息

注意: 防止两端都阻塞,recv send要配合

4.关闭套接字

技术图片
 1 """
 2 重点代码
 3 """
 4 
 5 from socket import *
 6 
 7 # 创建tcp套接字
 8 sockfd = socket() # 参数默认即tcp套接字
 9 
10 # 连接服务端程序
11 server_addr = ("172.40.91.150",8888)  # 服务端地址
12 sockfd.connect(server_addr)
13 
14 while True:
15   # 消息发送接收
16   data = input("Msg>>")
17   # 如果直接回车,则跳出循环
18   if not data:
19     break
20   sockfd.send(data.encode()) # 转换字节串发送
21   data = sockfd.recv(1024)
22   print("Server:",data.decode())
23 
24 sockfd.close()
tcp客户端流程

tcp 套接字数据传输特点

  • tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
  • tcp连接中如果一端已经不存在,仍然试图通过send发送则会产生BrokenPipeError
  • 一个监听套接字可以同时连接多个客户端,也能够重复被连接

网络收发缓冲区

  • 网络缓冲区有效的协调了消息的收发速度
  • send和recv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。

tcp粘包

代码示例:day2/stick_send.py,stick_recv.py

原因:tcp以字节流方式传输,没有消息边界。多次发送的消息被一次接收,此时就会形成粘包。

影响:如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。

处理方法:

  • 人为的添加消息边界
  • 控制发送速度
技术图片
 1 from socket import *
 2 
 3 
 4 sockfd = socket()
 5 
 6 server_addr = ("172.40.91.150",8888)
 7 sockfd.connect(server_addr)
 8 
 9 while True:
10   sockfd.send(bhello)
11 
12 sockfd.close()
tcp 粘包
技术图片
 1 import socket
 2 
 3 sockfd = socket.socket(socket.AF_INET,
 4                        socket.SOCK_STREAM)
 5 sockfd.bind((0.0.0.0, 8888))
 6 
 7 sockfd.listen(3)
 8 
 9 while True:
10   print("Waiting for connect ...")
11   connfd, addr = sockfd.accept()
12   print("Connect from", addr)
13 
14   n = 0
15   while n < 10:
16     n += 1
17     data = connfd.recv(5)
18     print(data)
19 
20   connfd.close()  # 断开连接
21 
22 # 关闭套接字
23 sockfd.close()
tcp粘包问题

练习:将一个文件从客户端发送到服务端,要求文件类型随意.
思路:读取文件--> send发送       recv接收--> write写入

技术图片
 1 from socket import *
 2 import time
 3 #    读取文件--> send发送
 4 s = socket()
 5 s.connect((127.0.0.1,8888))
 6 
 7 f = open(img.jpg,rb)
 8 
 9 # 读取内容,将其发送
10 while True:
11   data = f.read(1024)
12   if not data:
13     time.sleep(0.1)
14     s.send(b##)
15     break
16   s.send(data)
17 
18 time.sleep(0.1)
19 s.send("发送完毕".encode())
20 
21 f.close()
22 s.close()
23 ---------------------------------------------
24 from socket import *
25 
26 s = socket()
27 s.bind((0.0.0.0,8888))
28 s.listen(3)
29 
30 c,addr = s.accept()
31 print("Connect from",addr)
32 
33 # 以二进制写入
34 f = open(mm.jpg,wb)
35 
36 #循环接收内容,写入文件
37 while True:
38 #    recv接收--> write写入
39   data = c.recv(1024)
40   if data == b##:
41     break
42   f.write(data)
43 
44 data = c.recv(1024)
45 print(data.decode())
46 
47 f.close()
48 c.close()
49 s.close()
练习

 

网络编程:套接字socket(代码片段)

socket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端。首先,导入Python中的socket模块:importsocket其通信逻辑如下图所示:这张图片是整个socket编程的基础,必须牢牢记住。通过... 查看详情

python之socket网络编程(代码片段)

socket解释socekt又称为‘套接字’,用于描述IP和地址端口,是一个通信链路的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求。socket起源于Unix,所以也遵从“一切皆文件”的基本哲学,对于文件,... 查看详情

python3网络编程(代码片段)

文章目录一、Python3网络编程总结一、Python3网络编程Python提供了两个级别访问的网络服务。:低级别的网络服务支持基本的Socket,它提供了标准的BSDSocketsAPI,可以访问底层操作系统Socket接口的全部方法。高级别的网络... 查看详情

python之socket编程(代码片段)

一、socket简介socket(套接字)是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,将复杂的TCP/IP协议族隐藏在接口后面,让socket去组织数据以符合指定的协议。 下图左为socket在tcp/ip协议中的角色,右为socket的工作流... 查看详情

python网络编程——设定并获取默认的套接字超时时间(代码片段)

Sometimes,youneedtomanipulatethedefaultvaluesofcertainpropertiesofasocketlibrary,forexample,thesockettimeout.设定并获取默认的套接字超时时间。1.代码1importsocket234deftest_socket_timeout():5s=socket.socket(socket.AF_INE 查看详情

10.网络编程之socket(代码片段)

目录一、什么是socket?1.1套接字简介1.2套接字地址:主机-端口对二、面向连接的套接字和为无连接的套接字2.1面向连接的套接字2.2无连接的套接字三、python中socket3.1socket()模块函数3.2套接字对象(内置)方法3.3Socket中的一些参数四... 查看详情

网络编程-tcp(代码片段)

tc相当于打电话,需要先建立链接,区分客户端与服务端。importsocketdefmain():#1.创建tcp的套接字tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.链接服务器#tcp_socket.connect(("192.168.33.11",7890))server_ip=input("请输入要链接的服务器的ip:")se... 查看详情

socket网络编程

Python提供了两个级别访问的网络服务:  低级别的网络服务支持基本的Socket,它提供了标准的BSDSocketsAPI,可以访问底层操作系统Socket接口的全部方法  高级别的网络服务模块SocketServer,它提供了服务器中心类,可以简化网... 查看详情

python学习-网络编程(代码片段)

socketsocket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。socket与file的却别:file是对指定文件进行打开,读写,关闭socket是对服务器和客户端的socket进... 查看详情

python网络编程之tcp客户端程序开发

一、开发TCP客户端程序开发步骤回顾创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字二、socket类的介绍导入socket模块 importsocket创建客户端socket对象 socket.socket(AddressFamily,Type)参数说明:Ad... 查看详情

python网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序(代码片段)

socket介绍:socket(简称套接字),是进程间通讯的一个工具,他能实现把数据从一方传输到另一方,完成不同电脑上进程之间的通讯,它好比数据的搬运工。socket应用:不夸张来说,只要跟网络相关的应用程序或者软件都使用到了soc... 查看详情

Python Socket 编程 简单的 Web 服务器

...2015-02-1423:00:29【问题描述】:我正在编写我的第一个Python套接字编程代码,但我不知道出了什么问题。我输入运行该程序的服务器的IP地址以及端口号和我尝试接收的文件。我应该在浏览器中接收文件并且套接字应该关闭。相反... 查看详情

python爬虫第二课网络编程基础(代码片段)

2.1认识Python网络编程套接字(socket)网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。套接字是socket的通常叫法,用于描述IP地址和端口,是一个通信链的句柄,... 查看详情

python爬虫第二课网络编程基础(代码片段)

2.1认识Python网络编程套接字(socket)网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。套接字是socket的通常叫法,用于描述IP地址和端口,是一个通信链的句柄,... 查看详情

python学习笔记-scoket编程基础(代码片段)

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】... 查看详情

socket

socket  在网络编程中个一个基本组件就是套接字(socket)。套接字基本上是两个端点的程序之间的‘信息通道‘。程序可能分布在不同的计算机上(通过网络连接),通过套接字相互发送信息。在Python中大多数的网络编程都隐... 查看详情

python网络编程之tcp服务端程序开发

 一、开发TCP服务端程序开发步骤回顾创建服务端端套接字对象绑定端口号设置监听等待接受客户端的连接请求接收数据发送数据关闭套接字二、socket类的介绍导入socket模块importsocket创建服务端socket对象socket.socket(AddressFamily,Ty... 查看详情

python网络编程——处理套接字错误(代码片段)

在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应。Python的Socket库提供了一个方法,能通过socket。error异常优雅地处理套接字错误。1.代码及相关解释1#!/usr/bin/envpython2#-*-codi... 查看详情