zoukankan      html  css  js  c++  java
  • 网络编程

    网络编程

    计算机网路就是把各个计算机连接到一起,让网络中的计算机可以相互通信.网络编程就是如何在程序中实现两台计算机的通信.

    更加确切的说,网络通信是两台计算机上的两个进程之间的通信

    互联网协议就是计算机界的英语,网络就是物理连接介质+互联网协议
    让计算机都学会互联网协议,这样任意一台计算机在发消息时都严格按照协议规定的格式去阻止数据,接收方就可以按照相同的协议解析出结果,就能实现全世界的计算机无障碍通信.![互联网协议osi七层](D:1 Typora 整理笔记图片互联网协议osi七层.png)

    传输层: 四层交换机,四层路由器

    网络层: 路由器,三层交换机

    数据链路层: 网桥,以太网交换机, 网卡

    物理层: 中继器, 集线器, 双绞线

    网络层: 工作再网络层的是ip协议,会给每个计算机分配一个ip地址(0.0.0.0 - 255.255.255.255) 前三位称之为网络号,最后一位称之为主机号
    由于c类地址是共享的,所以单独使用网络号是无法区分子网,所以引入了子网掩码,专门用来验证两个ip地址是否属于同一个子网,子网掩码只是用于区分而已,具体如何找到,得靠网络号,通过路由协议来找到对方的网关. 有了ip协议之后,可以通过网络号来定位全球范围内的某个局域网,通过主机号来定位局域网中具体的某台计算机,虽然可以定位到以太计算机,但是无法定位到某个应用程序

    传输层: 工作再传输层的两个协议TCP/UDP
    传输层要求必须为每一个需要联网应用程序绑定一个端口号,用于区分是哪一个应用程序,端口号就是一个整数,最大不超过65535
    端口号在同一台计算机中不能重复
    注意: 不要使用常见的程序已经占用的端口

    以太协议的主要功能

    ​ 1, 定义电信号的分组方式, 一组电信号最大为1518,必须包含head 和 data
    2, 每个计算机必须具备网卡,网卡具备一个全球唯一的mac地址,可以用来表示唯一的一台计算机
    3, 由于不知道对方mac地址, 以太网通过广播的方式来进行通讯

    socket层

    ![](D:1 Typora 整理笔记图片socket.jpg)

    socket是什么?

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口. 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在Socket接口后面,让Socket去组织数据,遵循它的规定去编程,学出的程序就是遵循TCP协议的.![](D:1 Typora 整理笔记图片socket3.jpg)

    先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然后连接服务器(connect), 如果连接成功,这时客户端与服务器端的连接就简历了.客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束.

    socket服务器

    soc = socket.socket()
    
    # 作为服务器放必须为socket指定 ip和端口号
    soc.bind(("192.168.12.141", 1988))  # 端口不能超过65535   明确饭店地址
    
    # 开始监听端口  相当于饭店开门了 等着顾客来
    soc.listen()
    
    # 接收客户端的连接请求
    client, address = soc.accept()
    
    # 接收
    data = client.recv(1024)
    
    print(data.decode("utf-8"))
    
    # 发送
    client.send("我是你的服务器 ".encode("utf-8"))
    
    # 要注意 在服务端  收发数据是客户端socket来完成的  服务器端的sock 只做处理连接
    # 收发数据都是bytes类型
    
    # 关闭socket 回收资源
    soc.close()
    

    socket客户端

    import socket
    
    # 创建socket对象
    client = socket.socket()
    
    # 连接服务器
    client.connect(("192.168.12.141",1988)) # 就是在做三次握手
    
    # 收发数据
    client.send("你好".encode("utf-8"))
    
    data = client.recv(1024)
    print(data.decode("utf-8"))
    
    # 关闭连接
    client.close()  # 在做四次挥手操作
    
  • 相关阅读:
    对Linux内核中进程上下文和中断上下文的理解
    深入浅出进程与线程的基本概念
    真正明白c语言二级指针
    寄存器变量
    python类中初始化为可变对象的属性,在多次对类实例化时数据会堆叠
    python中使用uwsgi启动wsgi应用
    火狐新版移除developer Toolbar和无法关闭自动更新的解决
    hive中计算某个日期是星期几的算法
    计算两个日期之间的天数(去掉周六周日)
    hive动态分区常用参数
  • 原文地址:https://www.cnblogs.com/kp1995/p/10157032.html
Copyright © 2011-2022 走看看