Python核心编程 Day 1
网络编程
使用套接字进行网络编程
客服端服务器架构
分为硬件系统和软件系统
硬件 打印机和文件服务器
软件 web服务器 数据库服务器 窗体服务器
可以将一位银行出纳员看作服务器
客户端/服务器网络编程
为了使服务器工作顺利应该为其创建一个通信端点
从而能够让服务器像公司前台一样监听外界请求
这个监听是处于无限循环状态下的
当然要让服务器有意义地工作还必须散播自己的地址给外界让潜在的客户知道服务器的存在
套接字 即通讯端点
在任何网络应用程序想要与外界通讯之前必须创建套接字 这个过程由应用程序将权限交给操作系统并由操作系统来创建
套接字是计算机网络数据结构
套接字最初是为同一主机上的程序所创建的
使得程序之间能够通信(这就是所谓的进程间通信 Inter Process Communication IPC)
又被叫做BSD套接字或者伯克利套接字
套接字有很多 可分为两类
基于文件的 基于网络的
可以对他们按家族来分类 拥有家族名字
Unix AF_UNIX
基于网络的
AF_INTER6
Linux特殊类型
AF_NETLINK AF_TIPC
套接字的地址
如果套接字是一个电话插孔 那么他的地址就是主机名和端口名 就像区号和电话号码的组合一样来标记地址
面向连接的套接字和无连接的套接字
使用套接字通讯是分类的 就像电话通讯和快递通讯一样
面向连接
电话通信像水流一样是连续的 能确保每一段信息都能够到达目的地 然后将他们按顺序组合在一起
这种链接的协议就是就是TCP
创建TCP套接字 与之配对的套接字类型为SOCK_STREAM
设置以及维护需要的开销很大
无链接
快递运送包裹通讯 在通讯之前不需要建立连接 在传送过程中不能保证它的顺序性 可靠性和重复性
这种连接的协议就是UDP套接字
与之配对的套接字类型为SOCK_DGRAM
相比面向连接型无连接型比较经济并且更加易于维护
在架构自己的服务端和客户端时遇到的情况
python bytes和str两种类型转换的函数 encode(),decode()
str通过encode()方法可以编码为指定的bytes
反过来,如果从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法
bind()函数将一个地址绑定到socket创建的套接字上 每次绑定后在服务端关闭后五分钟之内都是无效的 会遇到"端口已绑定"的错误提示 要想再一次使用该端口需要等待五分钟
在我的服务端代码中 想要像客户端发送信息结果报错
TypeError: a bytes-like object is required, not ‘str’指的是18行 tcpCliSock.send(data)
data由recv()函数获取
传入的参数是应该是bytes类型,而不是str类型。
此时只要将data数据先decode()为字符串类型 然后再在使用send函数发送时encoding()一下就ok
socketserve模块 和 twisted框架的使用…