一,,结构介绍
1 c/s架构
c/s就是Client和Server的缩写,中文就是,客户端与服务端架构,这种架构也是从用户层面
来划分的
这里的客户端一般泛指客户端应用程序exe先安装才能应用
2 b/s架构
B/s就是Browser(浏览器),其实你也可以将其理解为是Client的一种,只是这个客户端不需要安装
程序,而是通过HTTP请求来实现的
二,网络基础
在网络上一个程序要如何才能找到另一个程序,
通过ip地址就可以实现
ip:ip地址就是指互联网协议地址它为互联网上的每一个网络和每一台主机分配一个逻辑地址,
以此来区分和物理地址的差异
IP地址是一个32位的二进制,通常被分割为4个“8”位的二进制
端口:英文:port可以理解为是设备与外界通讯交流的出口
在同一个时间内只有一个程序占用一个端口
端口的范围0--65535
一般都用8000之后的端口,
IP地址精确到一台电脑,二端口精确到具体的程序
TCP协议:面向连接的协议,可靠地,传输效率低,全双工通信,面向字节流,
UDP协议:不可靠,无连接的服务,传输效率低的,(发送前时延小),面向报文,尽最大努力服务
无拥塞控制
arp协议:通过ip找mac地址
mac:MAC地址是厂家指定的,全球唯一,不会重复
三 套接字(socket)
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的
1,,基于文件类型的套接字家族
AF_UNIX
unix一切皆文件,
2,,基于网络类型的套接字家族
AF_INET
osi七层模型
应用层,表示层,对话层,传输层,网络层,数据链路层,物理层
但是一般我们都关注于五层
存储:
应用层, 程序
传输层, tcp、udp
网络层, ip
数据链路层, mac arp
物理层 二进制,网线网卡
四,,socket初级使用
基于tcp协议的socket
tcp是基于链接的,所以必须先启动服务端,然后再启动客户端去链接服务端
server
import socket sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() coon,cli=sk.accept() ret=coon.recv(1024) print(ret) coon.send(b'ni') coon.close() sk.close()
client
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) sk.send(b'hello') ret=sk.recv(1024) print(ret) sk.close()
这种问题的解决方案:
import socket sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #端口的重复使用 sk.bind(('127.0.0.1',8080)) sk.listen() coon,cli=sk.accept() ret=coon.recv(1024) print(ret) coon.send(b'ni') coon.close() sk.close()
基于tcp的聊天程序
server
import socket sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(('127.0.0.1',8080)) sk.listen() coon,cli=sk.accept() while 1: ret=coon.recv(1024).decode('utf-8') print(ret) if ret=='bye': break info=input('>>>') coon.send(bytes(info,encoding='utf-8')) coon.close() sk.close()
client
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while 1: info=input('>>>') sk.send(bytes(info,encoding='utf-8')) ret=sk.recv(1024).decode('utf-8') print(ret) if ret=='bye': break sk.close()
上面说的都是基于tcp协议的,下面看看基于udp协议的
import socket,time sk=socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',8090)) msg,addr=sk.recvfrom(1024) msg=msg.decode('utf-8') sk.sendto(bytes(time.strftime(msg,time.localtime()),encoding='utf-8'),addr) sk.close()
import socket,time sk=socket.socket(type=socket.SOCK_DGRAM) dd=('127.0.0.1',8090) sk.sendto(bytes('%Y-%m-%d',encoding='utf-8'),dd) msg,addr=sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close()
C:UsershcAppDataLocalProgramsPythonPython36python3.exe C:/s9/day30/client.py 2018-01-26 Process finished with exit code 0