一 、客户端/服务器架构

1.硬件C/S架构(打印机)

2.软件C/S架构

二、

三、

1.互联网协议就相当于计算机界的英语

2.数据传输的过程中包头一定要是固定的长度

四、socket层的位置

socket层处于应用层于传输层之间--socket抽象层

五、socket是什么,作用是什么

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

所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

六、套接字发展史及分类

基于文件类型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

基于网络类型的套接字家族

套接字家族的名字:AF_INET

七、套接字工作流程

八、基于TCP的套接字

基础版

  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  3. phone.bind(('192.168.20.60',8080)) #绑定手机卡
  4. phone.listen(5) #开机
  5.  
  6. print('starting...')
  7. conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
  8. print(conn,client_addr)
  9.  
  10. #收,发消息
  11. data=conn.recv(1024)
  12. print('client data: <%s>' %data)
  13. conn.send(data.upper())
  14.  
  15. conn.close() #挂电话
  16. phone.close() #关机

tcp服务端

  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  3. phone.connect(('192.168.20.60',8080)) #绑定手机卡
  4.  
  5. #发,收消息
  6. phone.send('hello'.encode('utf-8'))
  7. data=phone.recv(1024)
  8. print('server back res:<%s>' %data)
  9.  
  10. phone.close()

tcp客户端

加上通信循环

  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  3. phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
  4. phone.bind(('192.168.20.60',8081)) #绑定手机卡
  5. phone.listen(5) #开机
  6.  
  7. print('starting...')
  8. conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
  9. print('-------->',conn,client_addr)
  10.  
  11. #收,发消息
  12. while True:#通信循环
  13. data=conn.recv(1024)
  14. # print('server has recv')
  15. print('client data: <%s>' %data)
  16. conn.send(data.upper())
  17.  
  18. conn.close() #挂电话
  19. phone.close() #关机

进阶版--服务端

  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  3. phone.connect(('192.168.20.60',8081)) #绑定手机卡
  4.  
  5. #发,收消息
  6. while True:
  7. msg=input('>>: ').strip()
  8. if not msg:continue
  9. phone.send(msg.encode('utf-8'))
  10. print('--->has send')
  11. data=phone.recv(1024)
  12. print('server back res:<%s>' %data)
  13.  
  14. phone.close()

进阶版--客户端

  1. #加入一条socket配置,重用ip和端口
  2.  
  3. phone=socket(AF_INET,SOCK_STREAM)
  4. phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
  5. phone.bind(('127.0.0.1',8080))

加上链接循环

  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  3. phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
  4. phone.bind(('192.168.20.60',8081)) #绑定手机卡
  5. phone.listen(5) #开机
  6.  
  7. print('starting...')
  8. while True: #链接循环
  9. conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
  10. print('-------->',conn,client_addr)
  11.  
  12. #收,发消息
  13. while True:#通信循环
  14. try:
  15. data=conn.recv(1024)
  16. if not data:break #针对linux
  17. print('client data: <%s>' %data)
  18. conn.send(data.upper())
  19. except Exception:
  20. break
  21. conn.close() #挂电话
  22. phone.close() #关机

再次进阶版--服务端

  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
  3. phone.connect(('192.168.20.60',8081)) #绑定手机卡
  4.  
  5. #发,收消息
  6. while True:
  7. msg=input('>>: ').strip()
  8. if not msg:continue
  9. phone.send(msg.encode('utf-8'))
  10. print('--->has send')
  11. data=phone.recv(1024)
  12. print('server back res:<%s>' %data)
  13.  
  14. phone.close()

再次进阶版--客户端(没变)

九、基于UDP的套接字

udp是无链接的,先启动哪一端都不会报错

  1. udp服务端
  2. 1 ss = socket() #创建一个服务器的套接字
  3. 2 ss.bind() #绑定服务器套接字
  4. 3 inf_loop: #服务器无限循环
  5. 4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
  6. 5 ss.close() # 关闭服务器套接字

udp服务端

  1. cs = socket() # 创建客户套接字
  2. comm_loop: # 通讯循环
  3. cs.sendto()/cs.recvfrom() # 对话(发送/接收)
  4. cs.close() # 关闭客户套接字

udp客户端

udp套接字简单示例

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',9000)
  5. BUFSIZE=1024
  6. udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  7.  
  8. udp_server_client.bind(ip_port)
  9.  
  10. while True:
  11. msg,addr=udp_server_client.recvfrom(BUFSIZE)
  12. print(msg,addr)
  13.  
  14. udp_server_client.sendto(msg.upper(),addr)

udp服务端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',9000)
  5. BUFSIZE=1024
  6. udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  7.  
  8. while True:
  9. msg=input('>>: ').strip()
  10. if not msg:continue
  11.  
  12. udp_server_client.sendto(msg.encode('utf-8'),ip_port)
  13.  
  14. back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
  15. print(back_msg.decode('utf-8'),addr)

udp客户端

qq聊天(由于udp无连接,所以可以同时多个客户端去跟服务端通信)

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. ip_port=('127.0.0.1',8081)
  5. udp_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #买手机
  6. udp_server_sock.bind(ip_port)
  7.  
  8. while True:
  9. qq_msg,addr=udp_server_sock.recvfrom(1024)
  10. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],qq_msg.decode('utf-8')))
  11. back_msg=input('回复消息: ').strip()
  12.  
  13. udp_server_sock.sendto(back_msg.encode('utf-8'),addr)

udp服务端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. BUFSIZE=1024
  5. udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6.  
  7. qq_name_dic={
  8. '狗哥alex':('127.0.0.1',8081),
  9. '瞎驴':('127.0.0.1',8081),
  10. '一棵树':('127.0.0.1',8081),
  11. '武大郎':('127.0.0.1',8081),
  12. }
  13.  
  14. while True:
  15. qq_name=input('请选择聊天对象: ').strip()
  16. while True:
  17. msg=input('请输入消息,回车发送: ').strip()
  18. if msg == 'quit':break
  19. if not msg or not qq_name or qq_name not in qq_name_dic:continue
  20. udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
  21.  
  22. back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
  23. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
  24.  
  25. udp_client_socket.close()

udp客户端1

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Linhaifeng'
  3. import socket
  4. BUFSIZE=1024
  5. udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6.  
  7. qq_name_dic={
  8. '狗哥alex':('127.0.0.1',8081),
  9. '瞎驴':('127.0.0.1',8081),
  10. '一棵树':('127.0.0.1',8081),
  11. '武大郎':('127.0.0.1',8081),
  12. }
  13.  
  14. while True:
  15. qq_name=input('请选择聊天对象: ').strip()
  16. while True:
  17. msg=input('请输入消息,回车发送: ').strip()
  18. if msg == 'quit':break
  19. if not msg or not qq_name or qq_name not in qq_name_dic:continue
  20. udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
  21.  
  22. back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
  23. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
  24.  
  25. udp_client_socket.close()

udp客户端2

服务端运行结果

客户端1运行结果

客户端2运行结果

python-day29--socket的更多相关文章

  1. day29——socket套接字(少量不全)

    day29 socket套接字 socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统. 为什么存在socket抽象层? 如果直接与操 ...

  2. 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)

    Python的socket高级应用(多进程,协程与异步)

  3. Python底层socket库

    Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...

  4. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  5. Python Udp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  6. Python Tcp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  7. Python 之socket的应用

    本节主要讲解socket编程的有关知识点,顺便也会讲解一些其它的关联性知识: 一.概述(socket.socketserver): python对于socket编程,提供了两个模块,分别是socket ...

  8. python tcp socket 多线程

    不多说,直接上代码 client.py #!/usr/bin/python import socket,sys,string host="localhost" port=8000 ...

  9. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

  10. 操作系统底层原理与Python中socket解读

    目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...

随机推荐

  1. excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法

    excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法 office2007应该遇到“向程序发送命令时出现 问题”,设置为以管理员运行也不好用,重装office也不好用,下面介绍下 ...

  2. nginx的权限问题(Permission denied)解决办法

    nginx的权限问题(Permission denied)解决办法 一个nginx带多个tomcat集群环境,老是报如下错误:failed (13: Permission denied) while ...

  3. Unity3D关于VR的Demo(一)

    https://blog.csdn.net/qq_15807167/article/details/52048998?locationNum=8&fps=1 阅读数:9716 最近有点忙,只有 ...

  4. centos下nginx安装与配置

    nginx依赖以下模块: l  gzip模块需要 zlib 库 l  rewrite模块需要 pcre 库 l  ssl 功能需要openssl库 tar xzvf nginx-1.9.15.tar. ...

  5. 07: python基础 零碎知识点

    目录: 1.1 python异常处理 1.2 三元运算,filter和map与lambda表达式结合使用举例 1.3 内置方法 1.4 动态导入模块 1.1 python异常处理返回顶部 1.Pyth ...

  6. 20145304 Exp5 MSF基础应用

    20145304 Exp5 MSF基础应用 实验后回答问题 (1)用自己的话解释什么是exploit,payload,encode. exploit是生成或启动已经设置好的攻击程序,获得相应权限.在实 ...

  7. 字符编码之间的相互转换 UTF8与GBK(转载)

    转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...

  8. 【angular2+typeScript+ng-zorro】Carousel 走马灯的左右方向控件实现

    ng-zorro Carousel 走马灯的左右方向控件实现 ng-zorro框架的走马灯本身还没有左右方向控件的实现,作者只是在文档中(0.6x)中曝出几个方法接口,如图: 实现: 在根compon ...

  9. 1、webpack编译打包Sass编译的css进js文件

    cnpm install css-loader --save-dev    //css-loader 是将css打包进js cnpm install style-loader --save-dev   ...

  10. MVC ---- IEnumerable<T>、List<T> 前台遍历展示

    突然做前台数据展示,发现IEnumerable 对一个列表的展示还是可以,但要是多个类型放在一个表中如何处理呢,如下: 一个类IEnumerable遍历 后台 public IEnumerable&l ...