Socket 基础/进阶-1
C/S 架构
浏览器是客户端,淘宝网页是服务端
C/S架构与socket的关系:
完成C/S架构的开发
osi七层
一个完整的计算机系统是由硬件、操作系统、应用软件三者组成 , 互联网的核心就是由一堆协议组成,协议就是标准,比如全世界人通信的标准是英语 , 类似于国际通用的英语。
C/S架构的软件(软件属于应用层)是基于网络进行通信的 , 想开发一款基于网络通信的软件,就必须遵循这些标准。
WHAT IS SOCKET ?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
套接字流程:
NB 的一张图:
1 服务端:
2 from socket import *
3 phone=socket(AF_INET,SOCK_STREAM)
4 phone.bind(('127.0.0.1',8080))
5 phone.listen(5)
6
7 conn,addr=phone.accept()
8
9 while 1:
10 data=conn.recv(1024)
11 print(data)
12 conn.send(data.upper())
13 conn.close()
14 phone.close()
15
16 客户端:
17 from socket import *
18
19 phone=socket(AF_INET,SOCK_STREAM)
20 phone.connect(('127.0.0.1',8080))
21
22 while 1:
23 msg=input(': ').strip()
24 phone.send(msg.encode('utf-8'))
25 data=phone.recv(1024)
26 print(data)
27
28 说明卡的原因:缓冲区为空recv就卡住,重新启动
29
30
31 服务端
32 from socket import *
33 phone=socket(AF_INET,SOCK_DGRAM)
34 phone.bind(('127.0.0.1',8080))
35 while 1:
36 msg,addr=phone.recvfrom(1024)
37 phone.sendto(msg.upper(),addr)
38 客户端
39 from socket import *
40 phone=socket(AF_INET,SOCK_DGRAM)
41 while True:
42 msg=input(': ')
43 phone.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
44 msg,addr=phone.recvfrom(1024)
45 print(msg)
TCP的套接字
注意:tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
tcp_server:
1 ss = socket() #创建服务器套接字
2 ss.bind() #把地址绑定到套接字
3 ss.listen() #监听链接
4 inf_loop: #服务器无限循环
5 cs = ss.accept() #接受客户端链接
6 comm_loop: #通讯循环
7 cs.recv()/cs.send() #对话(接收与发送)
8 cs.close() #关闭客户端套接字
9 ss.close() #关闭服务器套接字(可选)
tcp_client:
1 cs = socket() # 创建客户套接字
2 cs.connect() # 尝试连接服务器
3 comm_loop: # 通讯循环
4 cs.send()/cs.recv() # 对话(发送/接收)
5 cs.close()
UDP的套接字
注意:udp是无链接的,先启动哪一端都不会报错
udp_server
1 ss = socket() #创建一个服务器的套接字
2 ss.bind() #绑定服务器套接字
3 inf_loop: #服务器无限循环
4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
5 ss.close() # 关闭服务器套接字
udp_client
1 cs = socket() # 创建客户套接字
2 comm_loop: # 通讯循环
3 cs.sendto()/cs.recvfrom() # 对话(发送/接收)
4 cs.close() # 关闭客户套接字
注意:udp 服务端可以跟多个客户端沟通!