网络编程 socket模块 tcp协议 udp协议
Posted hdy19951010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程 socket模块 tcp协议 udp协议相关的知识,希望对你有一定的参考价值。
网络基础相关知识 , socket模块 , tcp协议通信代码
网络基础相关知识
(1) 架构
C / S 架构: client 客户端 和 server 服务器端
优势:能充分发挥pc机的性能
B / S 架构: browser 浏览器 和 server 服务器 隶属于C/S架构
B /S 架构 同意了应用的接口
(2) 通信
同意台电脑上两个py程序通信 : 打开一个文件
两台电脑通信 : 联网
多个电脑通信 : 电脑1发送一个请求帧,其中包含(我的IP和我的mac地址,和我要找的IP地址为xxxxxxx的主机),将此请求发送给交换机,交换机广播这条消息给其他所有主机
,目标主机接到这条消息后回复给交换机消息(我的IP地址和mac地址,请回复给源主机(实际这里是IP和mac来代替源主机)),交换机以单播的形式返回给源主机
mac 地址 : 是一个物理地址,全球唯一,类似于身份证
ip 地址 : 是一个四位点分十进制,它标识了计算机在网络中的位置
交换机的通信方式:
广播 : 吼一嗓子,发送给每台计算机
单播 : 一对一
组播 : 一对多
arp 协议 : 通过目标 ip 地址获取目标 mac 地址的一个协议
端口 : 操作系统为本机上每一个运行的程序都随机分配一个端口,其他电脑上的程序可以通过端口获取到这个程序
ip 地址 + 端口 能找到唯一某台电脑上的某一个服务程序
路由器 : 连接不同网段 , 路由
网关 : 类似于一个局域网的出口和入口
网段 : 一个局域往内的ip地址范围
子网掩码 : 子网掩码 & ip地址 得到网段
osi 五层模型:
应用层 : http , https , ftp
传输层 : tcp/udp 四层交换机 , 四层路由器
网络层 : ip协议 路由器 , 三层交换机
数据链路层 : arp协议 交换机 , 网卡 , 网桥
物理层 : 传输电信号 集成器 , 网线 , 光纤
socket 模块
import socket
socket 又叫做套接字
sk = socket.socket(family = AF_INET,type = SOCK_STREAM)
family:
一种 : AF_UNIX 基于文件类型的套接字(早起socket是源自于unix系统而研发的一个功能,主要是为了同一台电脑上,多个程序直接通信)
一种 : AF_INET 基于网络类型的套接字
type :
一种是基于 TCP 协议 SOCK_STREAM
一种是基于 UDP 协议 SOCK_DGRAM
tcp 协议 : 可靠的,面向连接的,面向字节流形式的额传输方式
udp 协议 : 不可靠的,不面向连接的,面向数据报的传输方式,但是传输速度快
例(同一台电脑上,服务器与客户端相互通信)
代码:
同一台电脑两个py文件通信(下面两个py文件配合使用)
服务器需要一个py文件
# 服务器(代码): import socket sk=socket.socket() #不传参数,默认使用基于网络类型的套接字,协议:TCP sk.bind((‘192.168.12.30‘,18907)) #端口的范围是0-65535 但是 0-1023 这些别用 sk.listen() #同时能接受的连接 while 1: conn,addr=sk.accept() #等待接受客户端的连接 , 阻塞等待 while 1: print(‘输入q退出聊天‘) ms_r=conn.recv(10033333).decode(‘utf-8‘) #接收 , 接收客户端传来的内容conn.recv(能接收的最大长度).decode(‘utf-8‘)接收过来解码成utf-8格式 print(ms_r) if ms_r.upper()==‘Q‘: break i=input(‘>>>‘) conn.send(i.encode(‘utf-8‘)) #发送 , conn.send()发送 i.encode(‘utf-8‘)将要传输的内容编码成bytes类型进行传输 if i.upper()==‘Q‘: break conn.close() sk.close()
客户端也需要一个py文件
客户端(代码):
# 客户端(代码): import socket sk=socket.socket() sk.connect((‘192.168.12.30‘,18907)) #连接到服务器 while 1: print(‘输入q退出‘) count=input(‘请输入内容‘) #输入要发送的内容 sk.send(count.encode(‘utf-8‘)) #发送 if count.upper() == ‘Q‘: break ma=sk.recv(10033333).decode(‘utf-8‘) #接收 , 接收服务器传输的内容sk.recv(能接收到额最大长度) , decode(‘utf-8‘)解码 if ma.upper()==‘Q‘: break print(ma) sk.close()
以上是关于网络编程 socket模块 tcp协议 udp协议的主要内容,如果未能解决你的问题,请参考以下文章
网络编程- socket协议小结hmac的检验客户端合法性和socketserver模块