python3 之 网络编程 socket

技术QQ交流群:294088839

# python 之网络编程
# osi介绍
# OSI(Open System Interconnection) 七层网络模型称为开放式系统互联参考模型
# 是一个逻辑上的定义 一个规范 它把网络从逻辑上分为了七层
# 每一层都有相关、相对应的物理设备 比如路由器 交换机

#  OSI 目标
# 解决异种网络互连时所遇到的兼容性问题 其最主要的功能是帮助不同类型的主机实现数据传输
# 他的最大优点是将服务、接口 和协议这三个概念明确区分开来
# 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠地通讯
# 应用层->表示层->会话层->传输层->网络层->数据链路层->物理层

# 网络接口层
# 物理层是定义物理介质的各种特性
# 机械特性
# 电子特性
# 功能特性
# 规程特性

# 数据链路层
# 负责接收IP数据包并通过网络发送
# 从网络上接收物理帧 抽出IP数据报 交给IP层
# 常用的接口协议层有:
# Ethernet 802.3、 Token Ring 802.5、 X.25、 Frame relay、 HDLC、 PPP、 ATM等
# 例如发送邮箱
# 首先 应用软件写完邮件后 写的文字或者视频 到了传输层后会通过不同的协议进行封装
# 然后 到网络层加一些IP等信息 到数据链层 还要进行IP 提取
# 然后  通过网卡把数据发送到互联网上
# 然后 到互联网后 有一些交换机和路由器 他们负责把数据进行来回分发找到相对应的机器
# 等到了目标主机后他就是反过来执行的过程

# 网络层
# 负责相邻计算机之间的通信
# 1. 处理来自传输层的分组发送请求 收到请求后 将分组装入IP数据报 填充报头 选择去往
# 信宿机的路径 然后将数据报发往适当的网络接口
# 2. 处理输入数据报 首先检查其合法性 然后进行巡径--假如该数据报已到达信宿机 则去掉报头
# 将剩下部分交给适当 的传输协议 假如该数据报尚未到信宿 则转发该数据报
# 3. 处理路径流控 拥塞等问题

# 网络层协议
# IP(Internet Protocol)
# ICMP(Internet Control Message Protocol)
# ARP(Address Resolution Protocol) 地址转换协议
# RARP(Reverse ARP) 反向地址转换协议

# 传输层
# 提供应用程序间的通信
# 1.格式化信息流
# 提供可靠传输 为实现后者 传输层协议规定接受端必须发回确认 并且假如分组丢失 必须重新发送
# 协议主要是:
#  传输控制协议 TCP(Transmission Control Protocol) 保证数据能在网络上传输 不会丢包
#  用户数据报协议 UDP(User Datagram protocol) 发送的过程有可能会丢包现象

# 应用层
# 向用户提供一组常用的应用程序
# 应用层一般是面向用户的服务
# 如FTP TELNET DNS SMTP POP3 HTTP

# 实现简单的服务器及客户端 socket编程
# socket 的英文原义是 孔 或 插座
# 通常也称作'套接字' 用于描述IP地址和端口 是一个通信链的句柄
# 每种服务都可开一个socket 并绑定到一个端口上 不同的端口对应于不同的 服务
# 应用程序通常通过'套接字'向网络发出请求或者应答网络请求

# socket连接过程
# 服务端监听
# 客户端请求
# 连接确认

# 开发一个S-C模型的程序
# 服务器: 使用ServerSocket监听指定的宽口 端口可以随意指定(建议使用1024以上的端口)返回(0-65535)
# 等待客户连接请求 客户连接口 会话产生 在完成会话后 关闭连接
# 客户端: 使用Socket对网络上某个服务器的某个端口发出连接请求 一旦连接成功 打开会话
# 会话完成后 关闭Socket 客户端不需要指定打开端口 通常临时的 动态的分配一个1024以上的端口

# python 有个socket 模块 支持
# family(IP) type(协议类型)  proto
# 服务端实现
# socket 对象
# 1.绑定IP 和端口
# bind()
# 监听端口
# listen()
# 2.获取连接状态
# accept()
# 3.通信
# 发送信息
# send()
# 接收信息
# recv()
# 4.关闭
# close()
import socket
# 创建一个的对象 指定IP类型AF_INET 指定协议类型  SOCK_STREAM
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定端口IP 和端口号
s.bind(('192.168.0.102',5400))
# 几个客户端连接
s.listen(10)
# 获取连接状态 一个是连接对象 一个是客户端的IP地址和端口号
conn, addr = s.accept()
print(addr[0])
while True:
    print("等待中...")
    #print(addr, conn)
    # 像客户端发送信息
    str = input('json:')
    conn.send(str.encode('utf-8'))
    # 获取客户端信息 最大字节数
    str = conn.recv(1024)
    print(str)
conn.close()



# 客户端
import socket
import time
# 创建一个的对象 指定IP类型AF_INET 指定协议类型  SOCK_STREAM
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# connect 连接服务器
c.connect(('192.168.0.102',5400))
while True:
    str = input('whl:')
    c.send(str.encode('utf-8'))
    print(c.recv(1024))
    time.sleep(1)

猜你喜欢

转载自blog.csdn.net/Drug_/article/details/81588388