day31 socket 一套编程接口【套接字】

今日回顾

网络编程: C(client) / S(server)   |   B(browers)/S(server)

网络通信:计算机间的数据传输,传输需要统一的协议

OSI:开放系统互联参考模型

应用层 |  表示层 | 会话层 |  传输层 |  网络层  |   数据链路层 |  物理层

数据链路层:以太网协议  每一个链接网路的设备必须有一个网卡(世界上独一无二的MAC地址);

             每一组数据需【head:固定长度18个字节(6源地址,6个目标地址,2个数据类型),date(最短46字节,最长1500字节)】

      数据链路层通过广播的方式来查找某一台计算机【通过交换机,在一个局域网】, 某一个mac响应后, 交换机会自主学习将保存mac与网口的映射关系

      问题:广播风暴,且没有可以链接所有设备的交换机

网络层:方要是IP协议

    1.每台设备必须有一个IP地址:四段三位点分十进制【其中前三段是网络号(常规情况), 最后一段是主机号】  000.000.000.000 --255.255.255.255

    2. ip数据包 【以太帧head  [ip head |  date]  】

    3.子网掩码  :用于标示IP中哪些是网络号,哪些是言主机号

          255.255.255.0

          11111111.11111111.11111111.00000000

          1表示网络号 0标示主机号

                                    将IP转为二进制,子网掩码转为二进制

             使用AND来计算两个IP是否处于同一局域网

          例如 1号ip 转换的结果如下

          11011111.00001111.10101010.00001

          11111111.11111111.11111111.0000000

         结果: 11011111.00001111.10101010.00000

 

         例如2号ip 转换的结果如下

          11011111.00001111.10101010.00010

          11111111.11111111.11111111.0000000

        结果: 11011111.00001111.10101010.00000

    4.ARP  Address Resolution Protocol

     该协议用于将IP转为MAC地址

     1.先比对子网掩码 判断两个IP是否处于同一子网中

     2.1如果是 则直接在当前局域网中进行广播

     2.2如果不是同一局域网,则将数据包发送对方的网关

     2.3对方网关收到数据包后回复自己的MAC地址

     2.4发送的交换机收到数据包在发送给 发送者同时存储对方网关与MAC的对应关系

                  2.5 发送已经明确对方网关的MAC以及对方的IP

       3. 发送数据 【我的MAC 对方网关的MAC【我的IP 对方的IP】】

   5. 路由协议:找到一条最佳的路径

   到此可以使用IP来定位到全球的某一个明着说网中的某一台计算机

传输层

  1.端口号:每个应用程序都必须绑定一个端口号,用于标识你是谁,是QQ,还是Pycharm

    端口号不能重复,为一个整形数字 取值范围 0-65535 0-1023为系统保留

       3. 传输层主要的传输协议

   TCP【传输控制协议】--可靠协议:三次握手建立链接,其目的是为了确认传输路径可用

                    传输过程中 每一个数据包都需要确认信息

                   四次挥手断开链接  是为了保障双方数据都已经传输完毕

                                                   传输效率较低

           UDP 【用户数据报协议】不关心数据是否传输成功,甚至不关心是否存在,传输效率高

应用层: 数据已经通过下面这种协议传入应用程序

     应用程序可以自己定义自己的协议,只要客户端程序与服务端程序能看懂就行:如 HTTP/HTTPS  SMTP FTP

今日内容   socket  【套接字】

socket: 一套编程接口,内部封装了一堆底层协议,隐藏了内部复杂的实现细节,提供了简单的使用接口---- 即一个位于TCP/UDP间的接口模块

socket的发展史:

  最开始socket使用来完成进程间通讯的,并不是用来网络通讯,那时候还没有网络

       后来有了网络之后 .基于之前的socket来进行了更新 使其可以支持网络通讯

       所以socket分为两种类型

       AF_UNIX : 进程间通讯

  AF_INET : 网络通讯 

 

socket 模块使用:

  服务端:phone = socket.socket( socket.AF_INET, socket.SOCK_STREAM)  # 拿到一个接口

      phone.bind(('127.0.0.1', 端口号))   #绑定一个IP号及端口号,【客户端不要绑定,没必要】

      phone.listen()  # 准备好了,听着呢

server端:

import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1', 9000))
phone.listen()

count = 1
while True:
print('第%s个客户来了'% count)
client, addr = phone.accept()

while True:
try:
date = client.recv(1024)
if not date:
print('windows 中的第%s个客户正常退出或收到linux 中的空值'% count)
client.close()
count +=1
break
client.send(date.upper())
except ConnectionResetError as e:
client.close()
print('第%s个客户非正常断开' % count)
count += 1
break

服务端:

import socket

phone1 = socket.socket()
phone1.connect(('127.0.0.1', 9000))

while True:
cmd = input('cmd:').strip()
if cmd == 'q':break
if not cmd:continue
phone1.send(cmd.encode('utf-8'))

date = phone1.recv(1024)
print(date)


phone1.close()

 

posted @ 2019-05-28 22:25  胖啊  阅读(150)  评论(0编辑  收藏  举报