1.什么是socket编程
网络世界基本都是TCP/IP协议进行通讯
TCP/IP协议是一种传输数据的方案

若使用requests库,发送HTTP请求消息,其实requests库底层也是使用的socket编程接口

2.python语言中的socket编程
要进行socket编程,发送网络信息,我们可以使用python内置的socket库,目前的socket编程,使用最多的就是通过TCP协议进行网络通讯,TCP通讯的双方分别为服务端和客户端,双方需要建立一个虚拟的连接,然后双方程序,才能发送业务数据信息,建立TCP虚拟连接是通过三次握手进行的。

1)服务端程序

# ============TCP 服务端程序(Linux)==================
# 导入socket库
from socket import *# 主机地址为0.0.0.0,表示绑定本机所有网络接口IP地址
# 等待客户端来连接
IP = '10.20.152.215'
# 端口号
PORT = 50000
#定义一次从socket缓冲区最多读入512个字节数据
BUFLEN = 512# 实例化一个socket对象,给一个类加上括号,进行实例化
# 参数AF_INET表示socket网络层使用IP协议
# 参数SOCK_STREAM表示socket传输层使用TCP协议
listenSocket = socket(AF_INET, SOCK_STREAM)   # 等待客户端连接# socket绑定IP地址和端口号
listenSocket.bind((IP, PORT))# 使用socket处于监听状态,等待客户端的连接请求
# 参数5表示,最多接受多少个等待连接的客户端
listenSocket.listen(5)
print(f'服务端启动成功,在{PORT}端口等待客户端连接...')dataSocket , addr = listenSocket.accept()
print('接受一个客户端连接:',addr)while True:# 尝试读取对方发送的消息# BUFLEN 指定从接收缓冲里最多读取多少个字节recved = dataSocket.recv(BUFLEN)# 如果返回空bytes,表示对方关闭了连接# 退出循环,结束消息收发if not recved:break# 读取的字节数据是bytes类型,需要解码为字符串info = recved.decode()print(f'收到对方信息:{info}')# 发送的数据类型必须是bytes,所以要编码dataSocket.send(f'服务端接收到了信息{info}'.encode())# 服务端也调用close()关闭socket
dataSocket.close()
listenSocket.close()

2)客户端程序

# ============TCP 客户端程序(TE)==================
# 导入socket库
from socket import *IP = '10.20.152.215'
SERVER_PORT = 50000
BUFLEN = 512# 实例化一个socket对象,指明协议,给一个类加上括号,进行实例化
dataSocket = socket(AF_INET,SOCK_STREAM)# 连接服务端socket
dataSocket.connect((IP,SERVER_PORT))while True:# 从终端读入用户输入的字符串toSend = input('>>>')if toSend == 'exit':break# 发送消息,也要编码为bytesdataSocket.send(toSend.encode())# 等待接受服务端的消息recved = dataSocket.recv(BUFLEN)# 如果返回空bytes,表示对方关闭了连接if not recved:break# 打印读取的消息print(recved.decode())dataSocket.close()

3.应用消息格式
实际企业开发过程中,消息往往是有格式定义的,消息的格式定义往往可以归入OSI网络模型的表示层。
比如:定义消息头、消息体
消息头存放消息的格式数据,比如长度、类型、状态等,消息体存放具体的传送数据
TCP协议传输的是字节流(bytes stream),如果消息中没有明确的消息边界,接收方不一定知道一个完整的消息从字节流的哪里开始到哪里结束。

指定消息的边界有两种形式
1)用特殊字节作为消息的结尾符号:可以用消息内容中不可能出现的字节串(如FFFFFF)作为消息的结尾字符。
2)在消息开头的某个位置,直接指定消息的长度:UDP协议通常不需要指定消息的边界,因为UDP是数据报协议,应用程序从socket接收到的必定是发送放发送的完整信息。

python_socket相关推荐

  1. Python_Socket实现简单的ssh/ftp

    Socket实现简单的ssh ssh_服务器端 import socket import os import timehost = "0.0.0.0"def echo_server ...

  2. 我的Python_Socket网络编程

    1.Socket语法及相关 sockettcp/ip send recvudp family address(地址簇):AF.INET #ipv4AF.INET6 #ipv6AF.UNIX #本地地址 ...

  3. python开发之路目录

    Python 目录 基础 python入门 python数据类型.字符编码.文件处理 python函数基础 python函数进阶 python装饰器函数 python装饰器函数 python递归函数 ...

  4. python打招呼的代码_LearnPython

    LearnPython 以撸代码的形式学习Python, 具体说明在知乎专栏-撸代码,学知识 ===================================================== ...

  5. 生成对抗网络的背景与意义_生成对抗网络的意义

    生成对抗网络的背景与意义 为什么我们需要生成对抗网络:-(Why do we need Generative Adversarial Network: -) If we show a lot and ...

  6. GitHub简明教程2

    GitHub简明教程1中给出了从github上clone仓库到本地,形成本地仓库,并通过git add.git commit.git push命令来提交到github上仓库的基本操作,接下来从以下4个 ...

最新文章

  1. ABBYY PDF Transformer+支持的格式
  2. Html dom window 对象 open()方法
  3. Spring中Bean的配置方式之通过全类名(反射)
  4. 剑指offer--打印1到最大的n位数
  5. 低效程序员的7个坏习惯
  6. mysql5.5 replication_mysql5.5 master-slave(Replication)配置
  7. php 取整十整百,php取整数的方法与实例总结
  8. WPS最大的败笔是“免费用,广告弹窗”,难怪用户纷纷使用office
  9. InDesign入门教程,如何导入文本?
  10. Web Service工作原理及实例
  11. Facebook F8|闲鱼高级技术专家参会分享
  12. 03-Axure9默认元件库
  13. Win10专业工作站版的Ghost备份与还原
  14. pdca管理循环基本主张_两个经典的循环管理法:PDCA SDCA
  15. C#获取枚举的key-value格式
  16. C++ 语言学习入门--类
  17. ROVIO安装运行及保存轨迹用evo评估
  18. 原来高手是这样练成的
  19. 利用vue实现树表格分页
  20. 7个你绝对没用过的超强搜索引擎

热门文章

  1. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型
  2. [C++] 牛客网:合并两个有序的数组
  3. 常用MySQL函数存储过程_解析MySQL存储过程、常用函数代码
  4. Android getDrawable 直接使用 提示要求API为21 的处理方法
  5. 微信小程序模板template
  6. linux防火墙cc,Linux防火墙后面的Alljoyn服务(iptables)
  7. oracle手工启动,SQLSERVER服务手工启动 批处理文件
  8. [WARNING] unable to add QUERY_STRING=XXXX to uwsgi packet, consider increasing buffer size
  9. SQL 全角半角转换-(摘抄)
  10. vs2015添加管理员权限