网络编程协议
C\S架构:client server(客户端-服务端)
安装一个客户端,就可以与服务端进行网络交互
B\S架构:browser server (浏览器-服务端)
所有的b\s都需要一个浏览器才能访问,
浏览器是一个软件,是特殊的客户端,
所有的b\s架构也都是c\s架构
多台机器间的通信:
网卡:计算机硬件,出厂的时候被分配的一个mac地址
MAC地址:唯一标识了一台机器(8C-I3-O3-DD-9D)
交换机: 用于局域网内多台机器间通信,可用arp协议通过ip找到mac地址
局域网:一个区域内多台电脑组成的一个内部网络(区域内电脑ip前缀相同)
IP地址:比MAC好记,按照区域来区分在那个局域网内
IP协议:在传输过程中规定位数.顺序等传输规则内容(IP地址规范)
ipv4:四位的点分十进制(32位二进制)\ipv6:六位的冒分十六进制
路由器:能够在局域网与局域网间通信
网关ip:在一台机器对局域网外的地址进行访问时使用的出口ip
端口:帮助我们在机器上的对应服务使用端口, 0-65535,使用8000以后
子网掩码:
本地回环地址:127.0.0.1
全网段地址:0.0.0.0
保留字段:192.168.0.0 - 192.168.255.255
172.16.0.0 - 172.32.255.255
10.0.0.1 - 10.255.255.255
TCP协议
面向连接 两台机器之间要想传递信息,必须先建立连接
可靠 在有连接的基础上数据传输,数据不会丢失,不会重复被接收
慢 每一次发送的数据还要等待结果(三次握手)(四次挥手)
对传递数据的长短没有要求
用于发邮件,文件时候
UDP协议
无连接 机器之间传递信息不需要建立连接,直接发就行
不可靠 数据可能丢失
快
不能传输过长的数据
常用于 即使通讯类软件 QQ 微信 飞信 歪歪
OSI七层协议
互联网的核心就是由一堆协议组成,协议就是标准所有的计算机都就可以按照统一的标准去收发信息从而完成通信。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,
它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
基于TCP协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
1 -------------------------client客户端------------------------------------ 2 import socket #导入套接口模块 3 sk=socket.socket() #创建一个套接口(对象) 4 sk.connect(('127.0.0.1',9999)) #要访问的服务器地址,共同端口 5 sk.send('好不好'.encode('utf-8')) #给服务器传送消息 6 msg=sk.recv(1024).decode('utf-8') #接收服务器消息 7 print(msg) 8 sk.close() #关闭套接口(与服务器连接对象) 9 -------------------------------------------------------------------------
1 #=======================serever服务器端================================== 2 import socket #导入套接口模块 3 sk = socket.socket() #创建一个套接口(对象) 4 sk.bind(('127.0.0.1',9999)) #定自己的服务器地址,共同端口 5 #(空\0.0.0.0\自己电脑ip) 6 sk.listen() #侦听服务器请求消息 7 conn,addr=sk.accept() #阻塞接口#接受连接,储存地址端口 8 msg =conn.recv(1024).decode('utf-8') #阻塞#接受连接地址传入字节 9 print(msg,addr) #打印消息 10 conn.send('你好'.encode('utf-8')) #给连接到(我)服务器的地址发消息 11 conn.close() #关闭地址端口 12 sk.close() #关闭套接口(对象接入) 13 #=========================================================================
socket对象,实际上是存储了所有的操作系统提供给我们的网络资源
基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接
1 #-----------------------------基于udp协议的客户端------------------------------------ 2 import socket 3 sk=socket.socket(type=socket.SOCK_DGRAM) #使用udp协议需指定socket参数type 4 server_addr = ('127.0.0.1',9999) #指定服务器地址端口 5 content = input('>>>') 6 sk.sendto(content.encode('utf-8'),server_addr) #直接给服务器地址传输数据 7 msg=sk.recv(1024).decode('utf-8') #接收来自服务器的数据 8 print(msg) 9 sk.close() 10 #----------------------------------------------------------------------------------
1 #=======================基于udp协议的服务器端================================= 2 import socket 3 sk=socket.socket(type=socket.SOCK_DGRAM) #使用udp协议需指定socket参数type 4 sk.bind(('127.0.0.1',9999)) #固定自己地址,给客户端链接用 5 msg,client_addr=sk.recvfrom(1024) #直接接受连接服务器的客户端数据 6 print(msg.decode('utf-8'),client_addr) 7 content = input('>>>') 8 sk.sendto(content.encode('utf-8'),client_addr)#给客户端发消息 9 sk.close() 10 # 打印的地址是一个元祖 11 #========================================================================
两种协议都有使用场景,且可以循环传输,在连接建立后可用while循环,同时在输入与接收时候
设置退出条件.
