网络编程
并发编程
数据库开发
web前端
开发软件,必须要开发一套客户端与服务端。
客户端与服务端的作用:
服务端:24小时不间断提供服务
客户端:如果想要找服务,就去寻找服务并享受
软件开发架构分为两种:
? C/S架构:Client(客户端)Sever(服务端)
? 优点:软件的使用稳定,并且可以节省网络资源。
? 缺点:1.若用户想在同一个设备上使用多个软件,必须下载多个客户端;2.软件的每一次更新,客户端也必须跟着重新下载更新。C/S架构的软件:电脑上的QQ,pycharm等,手机端的微信,王者荣耀等。
? B/S架构:Browser:浏览器 Server:服务端
? 优点:以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新软件版本,直接在浏览器上访问需要的软件。
? 缺点:消耗网络资源过大,当网络不稳定时,软件的使用也不稳定。
? B/S架构的软件:例如,在浏览器上输入某个软件的域名(http://oldboyedu.com/)。
? 网络编程、并发编程、数据库开发,可以开发一套C/S架构的软件。(防优酷系统)
? 前端html、css、js、web框架(网络编程、并发编程)可以开发一套B/S架构的软件(bbs系统)
-网络编程发展历史
所有先进的技术都源自于军事,希望通过远程获取数据,所有出现了‘网络编程’。
早期如何实现远程通信:
-打电话--》电话线
-纯平电脑(大屁股电脑)--》网线,有线网卡
-笔记本电脑--》有线网卡、无线网卡
要实现远程通信必须具备:
? 1.物理连接介质--》网卡
? 2.互联网协议
? -人与人之间沟通的介质:中文、英语
? -计算机之间沟通的介质:‘互联网协议’
? 互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织。
OSI七层协议:
-应用层
-表示层
-会话层
-传输层
-网络层
-数据链路层
-物理连接层
学习由下到上:需要优先了解的协议一共5层。
物理连接层
? 基于电信号发送二进制的数据
数据链路层
? 数据链路层的‘以太网协议’,专门用于处理基于电信号发送二进制的数据。
? 以太网协议:
? 1.规定好电信号数据的分组方式。
? 2.每一层连接网线的电脑都必须要有一块‘网卡’。
? -网卡由不同厂商生产的
? -每块网卡都会有世界上独一无二12的编号‘mac‘地址。
? -前6位:厂商号
? -后6位:流水号
? 交换机:可以让多台电脑连接到一起。
? 基于以太网协议发送数据:
? 特定:广播、单播
? 弊端:广播风暴、不能跨局域网通信。
? 互联网:让局域网之间进行通信。
网络层
? IP地址:用于标识唯一的一台计算机(局域网)的地址。
? IP:点分十进制
? 最小值:0.0.0.0
? 最大值:255.255.255.255
IPV4一开始用电脑的人不多,所以出现IPV4的协议版本。
IPV6:括号IP。
传输层
? TCP/UDP协议,他们都是基于端口工作的
? -端口号:标识电脑上某一个软件。
? -端口号范围:0-65535
注意:1.操作系统中,一般0-1024的端口都被默认使用了;2.尽量使用8000之后的端口号。
开发中常用软件的默认端口号:
mysql:3306
Django:8000
Tomcat:8080
Flask:5000
若想服务端与客户端进行通信,必须要建立连接,产生双向通道。一条是客户端往服务端发送消息的。另一条是服务端往客户端发送消息的。
应用层:http、ftp
ip:用于唯一标识某一台计算机的位置。
port:端口用于确认计算机上的一个应用软件。
ip+port:世界上某一台电脑上的一个应用软件。
-TCP协议的工作原理:
? TCP是一个流式协议
? 三次握手,四次挥手:
? -三次握手建连接:
? 建立双向通道,建立好连接。
? -listen:监听
? -established:确认请求建立连接
? -发送数据:
? write
? read
? 客户端往服务端发送数据,数据存放在内存中,需要服务端确认收到,数据才会在内存中释放掉。否则,会隔一段时间发送一次,让服务端返回确认收到。
在一段时间内,若服务端还是不返回确认收到,则取消发送。并释放内存中的数据。
-四次挥手断连接:-TIME-WAIT:时间等待。
什么是socket:socket是一个模块,可以写一套C/S架构的套接字。
为什么要使用socket:socket套接字会封装好各层协议的工作。好处:可以节省开发成本。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
如何使用:import socket
注意:客户端与服务端必须遵循:一端send,另一端recv不同两端同时send或recv.
1.初始socket套接字。
#服务端
import socket
#默认指定TCP协议
#买手机
server=socket.socket()
#插卡
server.bind(
#ip+port
('127.0.0.1',9527)
) #把地址绑定到套接字
#开机,等待接听
server.listen(5) #listen(5) 半连接池,监听链接。
#监听是否有消息
#conn:相当于服务端往客户端挖的管道
conn,addr=server.accept() #接收客户端链接
print(addr)
#听客户端给我说话
data=conn.recv(1024).decode('utf8') #可以接收1024字节数据,接收客户端信息
print(data)
conn.send(b'hello xiao zhu') #向客户端发送信息
#挂电话
conn.close() #关闭客户端套接字
#关机
server.close() #关闭服务器套接字
#关机
server.close()
运行结果:
('127.0.0.1', 54257)
你好,小贱贱
#客户端
import socket
#买手机
client=socket.socket()
#往服务端拨号
#client:相当于客户端往服务端挖的管道
client.connect(('127.0.0.1',9527)) #ip+port:寻找服务端,连接服务器
#客户端向服务端说话
client.send('你好,小贱贱'.encode('utf8'))
data=client.recv(1024) #对话(发送/接收)
print(data)
#关闭连接
client.close() #关闭客户端套接字
运行结果:
b'hello xiao zhu'
2.循环通信套接字
#服务端
import socket
server=socket.socket()
server.bind(
('127.0.0.1',9528)
)
server.listen(5)
conn,addr=server.accept()
print(addr)
while True:
#接收客户端发送过来的消息
data=conn.recv(1024).decode('utf8') #可以接收1024字节数据
print(data)
if data=='q':
break
#让服务端输入发送给客户端的消息
send_msg=input('server-->client: ').encode('utf8')
conn.send(send_msg)
conn.close()
#客户端
import socket
client=socket.socket()
client.connect(
('127.0.0.1',9528)
)
while True:
send_msg=input('client-->server:')
#服务端往客户端发送的数据
client.send(send_msg.encode('utf8'))
if send_msg=='q':
break
#服务端返回的数据
data=client.recv(1024).decode('utf8')
print(data)
client.close()
3.服务端多个客户端
#服务端
import socket
server=socket.socket()
server.bind(
('127.0.0.1',8888)
)
server.listen(5) #半连接池,可以“等待5个用户接受服务”
while True:
#等待客户端连接过来
conn,addr=server.accept()
print(addr)
#循环接收客户端数据
while True:
try:
data=conn.recv(1024).decode('utf8')
print(data)
#mac linux系统bug:b''
if len(data)==0:
continue
if data=='q':
break
conn.send(data.encode('utf8'))
except Exception as e:
print(e)
break
conn.close()
#客户端
import socket
client=socket.socket()
client.connect(
('127.0.0.1',8888)
)
while True:
send_msg=input('client-->server: ')
client.send(send_msg.encode('utf8'))
if send_msg=='q':
break
data=client.recv(1024).decode('utf8')
print(data)
client.close()
原文:https://www.cnblogs.com/lidandanaa/p/11694345.html