1.网络开发架构
1)C/S架构:客户端/服务端(client/server)
C/S优点:客户端能充分发挥PC的性能
2)B/S架构:浏览器/服务器(brower/server)隶属于C/S架构
B/S优点:统一了应用的接口
2.网络通信
1)同一个电脑两个py程序通信:2个py文件同时操作1个文件,一个读,一个写
2)两个电脑通信
3)多个电脑通信:局域网(交换机)---二层通信原理
2.Socket(套接字)
1)接口:别人写好的功能,自己去调用,这个功能的名字就是接口
print(‘abc’)调用了系统中的标准输出,所以可以打印内容,即print调用了这个接口
import sys print('abc') sys.stdout.write('abc') 输出: abc abc
2)socket感念
Socket是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,他把复杂的TCP/IP协议隐藏在Socker接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议
①基于文件类型的套件字(AF_Unix):socket是源自于unix系统而研发的功能,主要是为了同一台电脑上,多个程序直接通信
②基于网络类型的套接字(AF_INET)
3)socket层
通信类的程序想要实现通信必须要调用Socket(里面提供了一系列的方法),根据业务不同的传输模式(tcp/udp),在编写程序过程中,只关注发送的程序和发送所需要的协议,其他不用关注
4)协议类型(type)
①tcp:SOCK_STREAM
②udp: SOCK_DGRAM
3.Socket
1)服务端和客户端的连接
#server.py import socket import time sk = socket.socket() #包.类 不传参数,默认使用基于网络的套接字,使用TCP模式 #socket默认参数:family=AF_INET(基于网络的scoket), type=SOCK_STREAM(TCP模式), proto=0, fileno=None sk.bind(('192.168.43.223',18800)) #服务端的IP和开启的端口 sk.listen() #监听,同时能接受的连接(即A能访问百度,B也能访问百度) print("连接前。。。") conn,addr = sk.accept() #等待接受客户端的连接,程序阻塞等待(之前的程序执行,之后的在客户端连接后执行) print("连接后。。。") print("conn:%s",conn) print("addr:%s",addr) time.sleep(20) conn.close() sk.close() #关闭连接 #client.py import socket import time sk = socket.socket() sk.connect(('192.168.43.223',18800)) time.sleep(20) sk.close() #输出: 连接前。。。 连接后。。。 conn:%s <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.43.223', 18800), raddr=('192.168.43.223', 51742)> addr:%s ('192.168.43.223', 51742)
2)客户端和服务端的数据发送和接受
#server.py import socket import time sk = socket.socket() #买一个手机 sk.bind(('192.168.43.223',18800)) #买一个手机卡 sk.listen() #开机 conn,addr = sk.accept() #等待连接 #等待朋友打电话 str = conn.recv(1024) #等待接受服务器的大小,单位为字节 # str2 = conn.recv(1024) print(str.decode("utf-8")) # print(str2.decode("utf-8")) conn.close() #挂掉电话 sk.close() #关闭连接 #关机 #client.py import socket import time sk = socket.socket() sk.connect(('192.168.43.223',18800)) sk.send(b"Hello World !!!") #客户端发送的数据必须为bytes类型,否则无法传输 sk.send("你好,世界".encode("utf-8")) sk.close() #输出: Hello World !!!你好,世界
sk = socket.socket(family=AF_INET,type=SOCK_STREAM)
4)协议类型(type)
①tcp:SOCK_STREAM
②udp: SOCK_DGRAM
5)fimaly
①AF_unix
②AF_INET
重点总结:
①arp协议
②路由器、交换机区别
③tcp协议和udp协议的特点及tcp协议的编码
④TCP/IP五层模型
练习:
1)客户端和服务端持续通信,当一段输入q时两端退出
#server.py import socket import time sk = socket.socket() sk.bind(('127.0.0.1',18800)) sk.listen() conn,addr = sk.accept() #等待连接 while True: str_out = conn.recv(2048).decode("utf-8") #等待接受数据的大小,单位为字节 if str_out == 'q': break else: print(str_out) str_in = input(">>>") conn.send(str_in.encode("utf-8")) if str_in == "q": break conn.close() sk.close() #client.py import socket import time sk = socket.socket() sk.connect(('127.0.0.1',18800)) while True: str_in = input(">>>") sk.send(str_in.encode("utf-8")) #客户端发送的数据必须为bytes类型,否则无法传输 if str_in == 'q': break str_out= sk.recv(2048).decode("utf-8") print(str_out) if str_out=='q': break sk.close()
2)一个服务器轮流的和多个客户端进行通信(只需要在服务端加一个while循环即可)
python.py import socket import time sk = socket.socket() sk.bind(('127.0.0.1',18800)) sk.listen() while 1: conn,addr = sk.accept() #等待连接 while True: str_out = conn.recv(2048).decode("utf-8") #等待接受数据的大小,单位为字节 if str_out == 'q': break else: print(str_out) str_in = input(">>>") conn.send(str_in.encode("utf-8")) if str_in == "q": break conn.close() sk.close()