一. 楔子
两个程序之间想要传递一个数据,需要用到网络通信.
二. 软件开发的架构:
第一种: 应用类: qq,微信,网盘,优酷 这一类是属于需要安装的桌面应用.
第二种: web类: 百度,知乎,博客园,等使用浏览器访问就可以直接使用的应用.
这些应用的本质其实就是两个程序之间的通讯,而这两个分类又对应了两个软件开发的架构.
1.C/S 架构
C/S即: client与server,中文意思: 客户端与服务器端架构,这种架构也是从用户层面,(也是物理层面划分的).
2.B/S 架构
B/S即:browser和server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分.
browser浏览器,其实也是一种client客户端,只是这个客户端不需要大家去安装什么应用程序,只是需要通过http请求服务器端相关的资源(网页资源),客户端browser浏览器就能进行增删改查.
三. 网络基础.
1. osi七层模型.
2.socket概念
socket是应用层与TCP/IP协议族通信的中间软件抽象层,他是一组接口.在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议.
其实站在你的角度上看,socket就是一个模块.我们通过调用模块中实现的方法
建立两个进程之间的连接和通信. 也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,
而port是用来标识这台机器上的一个应用程序,
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信.
3. tcp协议和udp协议
TCP 可靠的.面向连接的协议,传输效率低全双工通信(发送缓存,接收缓存),面向字节流.
使用TCP的应用: web浏览器;电子邮件;文件传输程序.
UDP 不可靠的,无连接的服务,传输效率高(发送钱延迟小),一对一,一对多,多对多,面向报文,尽最大努力服务,无拥塞控制,使用UDP的应用: 域名系统(DNS); 视频流,IP语音.
四.套接字(socket)初使用.
1. 基于TCP协议的socket
tcp是基于连接的,必须先启动服务器,然后再启动客户端去连接服务器.
server端
import socket sk = socket.socket() sk.bind((‘127.0.0.1‘,8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b‘hi‘) #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
client端
import socket sk = socket.socket() # 创建客户套接字 sk.connect((‘127.0.0.1‘,8000)) # 尝试连接服务器 sk.send(b‘hello‘) ret = sk.recv(1024) # 对话(发送/接收) print(ret) sk.close() # 关闭客户套接字
问题: 重启服务端时可能会遇到,
解决方法:
# 加入一条socket配置,重用ip和端口. import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SQL_SOCKET,SO_REUSEADDR,1) # 就是它,在bind前加. sk.bind(‘127.0.0.1‘,8000) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接收客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) # 打印客户端信息 conn.send(b‘hi‘) # 向客户端发送信息 conn.close() # 关闭客户端套接字 sk.close() # 关闭服务器套接字(可选)
原文:https://www.cnblogs.com/marry215464/p/9588158.html