python-day29--socket
一 、客户端/服务器架构
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的套接字
基础版
- import socket
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
- phone.bind(('192.168.20.60',8080)) #绑定手机卡
- phone.listen(5) #开机
- print('starting...')
- conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
- print(conn,client_addr)
- #收,发消息
- data=conn.recv(1024)
- print('client data: <%s>' %data)
- conn.send(data.upper())
- conn.close() #挂电话
- phone.close() #关机
tcp服务端
- import socket
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
- phone.connect(('192.168.20.60',8080)) #绑定手机卡
- #发,收消息
- phone.send('hello'.encode('utf-8'))
- data=phone.recv(1024)
- print('server back res:<%s>' %data)
- phone.close()
tcp客户端
加上通信循环
- import socket
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
- phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
- phone.bind(('192.168.20.60',8081)) #绑定手机卡
- phone.listen(5) #开机
- print('starting...')
- conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
- print('-------->',conn,client_addr)
- #收,发消息
- while True:#通信循环
- data=conn.recv(1024)
- # print('server has recv')
- print('client data: <%s>' %data)
- conn.send(data.upper())
- conn.close() #挂电话
- phone.close() #关机
进阶版--服务端
- import socket
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
- phone.connect(('192.168.20.60',8081)) #绑定手机卡
- #发,收消息
- while True:
- msg=input('>>: ').strip()
- if not msg:continue
- phone.send(msg.encode('utf-8'))
- print('--->has send')
- data=phone.recv(1024)
- print('server back res:<%s>' %data)
- phone.close()
进阶版--客户端
- #加入一条socket配置,重用ip和端口
- phone=socket(AF_INET,SOCK_STREAM)
- phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
- phone.bind(('127.0.0.1',8080))
加上链接循环
- import socket
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
- phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
- phone.bind(('192.168.20.60',8081)) #绑定手机卡
- phone.listen(5) #开机
- print('starting...')
- while True: #链接循环
- conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
- print('-------->',conn,client_addr)
- #收,发消息
- while True:#通信循环
- try:
- data=conn.recv(1024)
- if not data:break #针对linux
- print('client data: <%s>' %data)
- conn.send(data.upper())
- except Exception:
- break
- conn.close() #挂电话
- phone.close() #关机
再次进阶版--服务端
- import socket
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
- phone.connect(('192.168.20.60',8081)) #绑定手机卡
- #发,收消息
- while True:
- msg=input('>>: ').strip()
- if not msg:continue
- phone.send(msg.encode('utf-8'))
- print('--->has send')
- data=phone.recv(1024)
- print('server back res:<%s>' %data)
- phone.close()
再次进阶版--客户端(没变)
九、基于UDP的套接字
udp是无链接的,先启动哪一端都不会报错
- udp服务端
- 1 ss = socket() #创建一个服务器的套接字
- 2 ss.bind() #绑定服务器套接字
- 3 inf_loop: #服务器无限循环
- 4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
- 5 ss.close() # 关闭服务器套接字
udp服务端
- cs = socket() # 创建客户套接字
- comm_loop: # 通讯循环
- cs.sendto()/cs.recvfrom() # 对话(发送/接收)
- cs.close() # 关闭客户套接字
udp客户端
udp套接字简单示例
- #_*_coding:utf-8_*_
- __author__ = 'Linhaifeng'
- import socket
- ip_port=('127.0.0.1',9000)
- BUFSIZE=1024
- udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- udp_server_client.bind(ip_port)
- while True:
- msg,addr=udp_server_client.recvfrom(BUFSIZE)
- print(msg,addr)
- udp_server_client.sendto(msg.upper(),addr)
udp服务端
- #_*_coding:utf-8_*_
- __author__ = 'Linhaifeng'
- import socket
- ip_port=('127.0.0.1',9000)
- BUFSIZE=1024
- udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- while True:
- msg=input('>>: ').strip()
- if not msg:continue
- udp_server_client.sendto(msg.encode('utf-8'),ip_port)
- back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
- print(back_msg.decode('utf-8'),addr)
udp客户端
qq聊天(由于udp无连接,所以可以同时多个客户端去跟服务端通信)
- #_*_coding:utf-8_*_
- __author__ = 'Linhaifeng'
- import socket
- ip_port=('127.0.0.1',8081)
- udp_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #买手机
- udp_server_sock.bind(ip_port)
- while True:
- qq_msg,addr=udp_server_sock.recvfrom(1024)
- print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],qq_msg.decode('utf-8')))
- back_msg=input('回复消息: ').strip()
- udp_server_sock.sendto(back_msg.encode('utf-8'),addr)
udp服务端
- #_*_coding:utf-8_*_
- __author__ = 'Linhaifeng'
- import socket
- BUFSIZE=1024
- udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- qq_name_dic={
- '狗哥alex':('127.0.0.1',8081),
- '瞎驴':('127.0.0.1',8081),
- '一棵树':('127.0.0.1',8081),
- '武大郎':('127.0.0.1',8081),
- }
- while True:
- qq_name=input('请选择聊天对象: ').strip()
- while True:
- msg=input('请输入消息,回车发送: ').strip()
- if msg == 'quit':break
- if not msg or not qq_name or qq_name not in qq_name_dic:continue
- udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
- back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
- print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
- udp_client_socket.close()
udp客户端1
- #_*_coding:utf-8_*_
- __author__ = 'Linhaifeng'
- import socket
- BUFSIZE=1024
- udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- qq_name_dic={
- '狗哥alex':('127.0.0.1',8081),
- '瞎驴':('127.0.0.1',8081),
- '一棵树':('127.0.0.1',8081),
- '武大郎':('127.0.0.1',8081),
- }
- while True:
- qq_name=input('请选择聊天对象: ').strip()
- while True:
- msg=input('请输入消息,回车发送: ').strip()
- if msg == 'quit':break
- if not msg or not qq_name or qq_name not in qq_name_dic:continue
- udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
- back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
- print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
- udp_client_socket.close()
udp客户端2
服务端运行结果
客户端1运行结果
客户端2运行结果
python-day29--socket的更多相关文章
- day29——socket套接字(少量不全)
day29 socket套接字 socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统. 为什么存在socket抽象层? 如果直接与操 ...
- 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)
Python的socket高级应用(多进程,协程与异步)
- Python底层socket库
Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...
- 转:Python 的 Socket 编程教程
这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...
- Python Udp Socket
socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...
- Python Tcp Socket
socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...
- Python 之socket的应用
本节主要讲解socket编程的有关知识点,顺便也会讲解一些其它的关联性知识: 一.概述(socket.socketserver): python对于socket编程,提供了两个模块,分别是socket ...
- python tcp socket 多线程
不多说,直接上代码 client.py #!/usr/bin/python import socket,sys,string host="localhost" port=8000 ...
- 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具
老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...
- 操作系统底层原理与Python中socket解读
目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...
随机推荐
- excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法
excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法 office2007应该遇到“向程序发送命令时出现 问题”,设置为以管理员运行也不好用,重装office也不好用,下面介绍下 ...
- nginx的权限问题(Permission denied)解决办法
nginx的权限问题(Permission denied)解决办法 一个nginx带多个tomcat集群环境,老是报如下错误:failed (13: Permission denied) while ...
- Unity3D关于VR的Demo(一)
https://blog.csdn.net/qq_15807167/article/details/52048998?locationNum=8&fps=1 阅读数:9716 最近有点忙,只有 ...
- centos下nginx安装与配置
nginx依赖以下模块: l gzip模块需要 zlib 库 l rewrite模块需要 pcre 库 l ssl 功能需要openssl库 tar xzvf nginx-1.9.15.tar. ...
- 07: python基础 零碎知识点
目录: 1.1 python异常处理 1.2 三元运算,filter和map与lambda表达式结合使用举例 1.3 内置方法 1.4 动态导入模块 1.1 python异常处理返回顶部 1.Pyth ...
- 20145304 Exp5 MSF基础应用
20145304 Exp5 MSF基础应用 实验后回答问题 (1)用自己的话解释什么是exploit,payload,encode. exploit是生成或启动已经设置好的攻击程序,获得相应权限.在实 ...
- 字符编码之间的相互转换 UTF8与GBK(转载)
转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...
- 【angular2+typeScript+ng-zorro】Carousel 走马灯的左右方向控件实现
ng-zorro Carousel 走马灯的左右方向控件实现 ng-zorro框架的走马灯本身还没有左右方向控件的实现,作者只是在文档中(0.6x)中曝出几个方法接口,如图: 实现: 在根compon ...
- 1、webpack编译打包Sass编译的css进js文件
cnpm install css-loader --save-dev //css-loader 是将css打包进js cnpm install style-loader --save-dev ...
- MVC ---- IEnumerable<T>、List<T> 前台遍历展示
突然做前台数据展示,发现IEnumerable 对一个列表的展示还是可以,但要是多个类型放在一个表中如何处理呢,如下: 一个类IEnumerable遍历 后台 public IEnumerable&l ...