+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-03(1)

2019-06(1)

2019-07(6)

2019-08(112)

2019-09(101)

2019-10(2)

从零开始的Python学习Episode 21——socket基础

发布于2019-08-08 17:56     阅读(113)     评论(0)     点赞(5)     收藏(5)


socket基础

网络通信要素

    A:IP地址   (1) 用来标识网络上一台独立的主机

                   (2) IP地址 = 网络地址 + 主机地址(网络号:用于识别主机所在的网络/网段。主机号:用于识别该网络中的主机)

                   (3) 特殊的IP地址:127.0.0.1(本地回环地址、保留地址,点分十进制)可用于简单的测试网卡是否故障。表示本机。

    B:端口号:  (1) 用于标识进程的逻辑地址。不同的进程都有不同的端口标识。

                   (2) 端口:要将数据发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这些数字,则将这些数字称为端口。(此端口是一个逻辑端口)

   C: 传输协议通讯的规则。例如:TCP、UDP协议(好比两个人得用同一种语言进行交流)

 

①、UDP:User Datagram Protocol用户数据报协议

特点:

  • 面向无连接:传输数据之前源端和目的端不需要建立连接。
  • 每个数据报的大小都限制在64K(8个字节)以内。
  • 面向报文的不可靠协议。(即:发送出去的数据不一定会接收得到)
  • 传输速率快,效率高。
  • 现实生活实例:邮局寄件、实时在线聊天、视频会议…等。

 

 ②、TCP:Transmission Control Protocol传输控制协议

 特点:

  • 面向连接:传输数据之前需要建立连接。
  • 在连接过程中进行大量数据传输。
  • 通过“三次握手”的方式完成连接,是安全可靠协议。
  • 传输速度慢,效率低。

注意:在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接

 

socket通信流程

                               

 

具体流程描述

流程描述:
1 服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
2 服务器为socket绑定ip地址和端口号
3 服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
4 客户端创建socket
5 客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
6 服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直等到客户端返回连接信息后才返回,开始接收下一个客户端连接请求
7 客户端连接成功,向服务器发送连接状态信息
8 服务器accept方法返回,连接成功
9 客户端向socket写入信息(或服务端向socket写入信息)
10 服务器读取信息(客户端读取信息)
11 客户端关闭
12 服务器端关闭

 

各种方法和参数

复制代码
sk.bind(address)

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

sk.getpeername()

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

sk.getsockname()

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

sk.fileno()

  #套接字的文件描述符
复制代码

 

简单例子

 

复制代码
'''server端'''
import socket
ip_port = ('127.0.0.1',9999)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

print('server is waiting...')

conn,addr = sk.accept()
client_data = conn.recv(1024)
print(str(client_data,'utf8'))
conn.sendall(bytes('hi!',encoding="utf-8"))

sk.close()

###################
'''client端'''
import socket
ip_port = ('127.0.0.1',9999)

sk = socket.socket()
sk.connect(ip_port)


sk.sendall(bytes('hi',encoding="utf8"))

server_reply = sk.recv(1024)
print (str(server_reply,"utf8"))
复制代码

 

 

两端聊天例子

复制代码
#--------------server端
import socket
ip_port = ('127.0.0.1',9999)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print('server is waiting...')
conn,addr = sk.accept()
while True:
    client_data = conn.recv(1024)
    if str(client_data,'utf8')=='exit':
        break
    print('<<<',str(client_data,'utf8'))
    inp = input('>>>')
    conn.sendall(bytes(inp,encoding="utf-8"))

sk.close()

#--------------client端
import socket
ip_port = ('127.0.0.1',9999)

sk = socket.socket()
sk.connect(ip_port)
while True:
    inp = input('>>>')
    sk.sendall(bytes(inp, encoding="utf8"))
    if inp == 'exit':
        break
    server_reply = sk.recv(1024)
    print ('<<<',str(server_reply,"utf8"))
复制代码

 

粘包问题

sendall会把数据直接全部发送到客户端,客户端将所有的数据都放到缓冲区,每次recv多少字节取决于recv内的参数,理论不应该超过8k。

所以,并不能一次recv()无限大数据。解决粘包问题主要思路是先获取要传输的数据的大小,先传到目标主机,接着再发送数据。另外,目标主机以数据的大小为标准循环接收数据直至获取完毕。



所属网站分类: 技术文章 > python文章

作者:忘也不能忘

链接: http://www.pythonheidong.com/blog/article/15540/

来源:python黑洞网 www.pythonheidong.com

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0

赞一赞 or 踩一踩

收藏该文
已收藏

评论内容:(最多支持255个字符)

相似文章

  FlaskWeb开发:基于Python的Web应用开发实战 pdf下载

  Beginning Python Games Development(2nd) pdf下载

  Head First Python(中文版)pdf下载

  python面试题之介绍一下Python中webbrowser的用法

  python面试题之Python代码实现删除一个list里面的重复元素

  笨办法学python pdf下载

  python面试题Python2.x和Python3.x的区别

  python面试题之Python 的特点和优点是什么

  Python3.2.3官方文档(中文版)pdf下载

  Python编程快速上手 让繁琐工作自动化 pdf下载

优质资源排行榜

 python经典电子书大合集下载 下载次数 8108

 零基础java开发工程师视频教程全套,基础+进阶+项目实战(152G) 下载次数 7545

 零基础前端开发工程师视频教程全套,基础+进阶+项目实战(共120G) 下载次数 7439

 零基础大数据全套视频400G 下载次数 7002

 零基础php开发工程师视频教程全套,基础+进阶+项目实战(80G) 下载次数 6891

 零基础软件测试全套系统教程 下载次数 6502

 全套人工智能视频+pdf 下载次数 6437

 IOS全套视频教程 基础班+就业班 下载次数 4679

 编程小白的第一本python入门书(高清版)PDF下载 下载次数 3106

10  effective python编写高质量Python代码的59个有效方法 pdf下载 下载次数 3073

11  Python深度学习 pdf下载 下载次数 3044

12  使用python+pygame开发的小游戏《嗷大喵快跑》源码下载 下载次数 2998

13  python项目开发视频 下载次数 2998

14  python从入门到精通视频(全60集)python视频教程下载 下载次数 2994

15  黑马2017年java就业班全套视频教程 下载次数 2992

16  python实战项目 平铺图像板系统源码下载,适用于想要保存,标记和共享图像,视频和网页的用户 下载次数 2987

17  利用python实现程序内存监控脚本 下载次数 2986

18  树莓派Python编程指南 pdf下载 下载次数 2980

19  老男孩python自动化视频 下载次数 2979

20  老王python基础+进阶+项目视频教程 下载次数 2972

21  尚硅谷Go学科全套视频 下载次数 2972

22  某硅谷Python项目+AI课程+核心基础视频教程 下载次数 2967

23  Web前端实战精品课程 下载次数 2966

24  Python基础教程 pdf下载 下载次数 2966

25  tron python小游戏 下载次数 2962

26  [小甲鱼]零基础入门学习Python 下载次数 2959

27  老男孩python全栈开发15期 下载次数 2958

28  2017最新web前端开发完整视频教程附源码 下载次数 2948

29  最新全套完整JAVAWEB2018开发视频 下载次数 2926

30  Python算法教程_中文版 pdf下载 下载次数 2913

31  Spring boot实战视频6套下载 下载次数 2909

32  python全套视频十五期(116G) 下载次数 2901

33  Python项目实战 下载次数 2883

34  python全自动抢火车票教程-python视频教程下载 下载次数 2883

35  30个小时搞定Python网络爬虫 含源码 下载次数 2881

36  尚硅谷大数据之Hadoop视频 下载次数 2876

37  简明python教程 (A Byte of Python)pdf下载 下载次数 2873

38  Python Cookbook第三版中文PDF下载高清完整扫描原版 下载次数 2865

39  Python A~B~C~ python视频教程下载 下载次数 2864

40  数据结构与算法视频(小甲鱼讲解-全) 下载次数 2863

41  web小程序表白天数倒计时源码下载 下载次数 2862

42  python基础视频教程 下载次数 2862

43  Python高性能编程 pdf下载 下载次数 2862

44  go语言全套视频 下载次数 2854

45  利用Python进行数据分析 pdf下载 下载次数 2850

46  清华学霸尹成Python爬虫视频-ok 下载次数 2845

47  黑马前端36期最全视频和代码 下载次数 2841

48  2018最新全套web前端视频教程+源码下载 下载次数 2840

49  老男孩Python自动化开发12期 老男孩最强一期python高级运维开发课程 第二部分 70GB 下载次数 2832

50  笨办法学python pdf下载 下载次数 2828