zoukankan      html  css  js  c++  java
  • 网络编程之基础篇一

    1.软件开发的架构:

      1) C/S 架构:client server, 客服端与服务器端架构,这种架构是从用户层面来划分的,这里的客户端泛指客户端应用程序exe,程序要先安装,对用户的电脑操作系统环境依赖较大

      2)B/S 架构:browser server, 浏览器端和服务器端架构,

    2.IP地址:

      ip地址是一个32位二进制数,通常被分割为48位二进制数(就是4个字节).ip地址通常用’点分十进制’表示,

      :100.4.5.6, 每一位都是0-255之间的十进制整数. 转为二进制:01100100.00000100.00000101.00000110

      mac地址是全球唯一的,网卡内置的地址;

      arp协议是通过目标ip地址来获取mac地址的

    3.osi七层模型:

      七层分法: 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层

      五层分法: 物理层(传电信号)-数据链路层(arp协议)-网络层(ip协议)-传输层(TCP/UDP)-应用层(ftp/http/https)

      四层分发: 网络接口层-网络层-传输层-应用层

    4.socket概念:

      1)socket是应用层TCP/IP协议族通信的中间软件抽象层,他是一组接口.设计模式中,socket其实就是一个门面模式,

    它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,socket去组织数据,以符

    合指定的协议.

    2)其实站在我们的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连

    接和通信。也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这

    台机器上的一个应用程序。所以只要确立了ipport就能找到一个应用程序,并使用socket模块来与之通信。

    3)socket套接字,又称:伯克利套接字或bsd套接字.一开始,套接字被设计用在同一台主机上多个应用程序之间的通

    讯。这也被称进程间通讯,IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型.

    文件型套接字(AF_UNIX):  unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接

    字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信.

    网络型套接字(AF_INET):  所有地址家族中,AF_INET是使用最广泛的一个.

    5.TCPUDP:

      TCP: 可靠的,面向连接的协议,传输效率低全双工通信,面向字节流

      UDP: 不可靠的,不面向连接的协议,传输效率高,面向报文,无拥塞控制,可一对多,多对多,多对一.

    6.套接字(socket)初使用:

      首先,TCP是基于链接的,因此必须先启动服务端,然后再启动客户端去链接服务端.

     server服务器端:

        sk=socket.socket()       实列化一个套接字对象

        sk.bind((192.168.88.88,6613))  把地址绑定到套接字

        sk.listen()     监听链接

        conn,addr=sk.accept()  接受客户端链接

        ret=conn.recv(1024)  设置接受用户端信息多少

        print(ret)   打印客户端信息

        conn.send(b’xxx’) 向客户端发送信息

        conn.close()  关闭客户端套接字

        sk.close()   关闭服务器套接字

     client客户端:

          sk=socket.socket()  创建客户端套接字

          sk.connect(‘192.168.88’.88,6613) 尝试连接服务器

          sk.send(b’xxxx’)

          ret=sk.recv(10000) 对话

          print(ret)    打印获得的信息

         sk.close()   关闭客户端套接字

    7.socket() 参数整理:

      默认: sk = socket.socket(family = AF_INET, type=SOCK_STREAM)

      

      family参数: AF_UNIX(基于文件形式的套接字)

                        AF_INET(基于网络形式的套接字)

      type 参数: 一种是基于TCP协议    SOCK_STREAM

                       一种是基于UDP协议   SOCK_DGRAM

    8.打印进度条:print('\r'+ i*'=' + '>' + str(i*2) + '%',end='')  ifor i in range(51)里的

    补充知识点:

    1.交换机的通信方式:  广播,  单播,  组播

      功能:组成局域网,将数据以点对点或点对多的方式发送给目标

      路由器的功能: 跨网段的数据传输,为下联设备分配ip地址

    2.TCP粘包原因:

      什么是粘包: 发送端发送数据后,接收端不知道该接收多少,所以导致数据混乱

      原因: 和包机制(nagle)  与  拆包机制.  都是发生在发送端的

    3.操作系统本质就是个软件,只不过是用来直接操作硬件的,这是其特殊之处

    4.进程的理论:

        进程是一个动态的概念,理解为正在运行的程序

        xx.sh  表示是个shell脚本文件       xx.bat  表示是个批处理脚本文件

        xx.out 表示Linux系统中的可执行文件    xx.exe  表示win系统中的可执行文件

        xx.lib  表示库文件            xx.dll   表示是个库

    5.multiprocessing 内置模块,python提供,用于多进程编程

    6.TCP只允许在同一个时间内,只能由一个客户端和服务器保持连接

      UDP允许一个服务器和多个客户端同时通信

      TCP协议的三次握手和四次挥手简述:

             三次握手: 第一次请求一定是客户端先发起!!!

                    客户端向服务端发送请求连接

                    服务端回复确认收到请求,并要求也连接客户端

                   客户端回复服务器确认连接

           四次挥手: 谁先发起都可以,这里以客户端为例来说明

                  客户端发起断开连接的请求,并表示我已没有数据发送,你有数据继续发,我继续收

                 服务端回复确认收到

                 服务端再次回复一个确认断开的连接请求

                 客户端回复一个确认收到

      补充:syn=1代表请求建立连接;ack=1代表确认连接;seq=12..3是个序列号;fin=1代表请求断开链接

              TCP协议为什么比UDP协议可靠,主要原因是TCP会保留发送出去的数据备份,等另一端确认收到后才会销毁

        掉备份,如一段时间内没有收到回复,则重新再发送一次,UDP无此机制

    网络编程模块统计:

    socket套接字模块,  subprocess调用系统cmd窗口模块,  struct转定长数模块(packunpack)

    1) struct模块示列:  import  struct

      y=struct.pack(‘类型’,数字) 把任意长度的数字转为固定4bytes长度的二进制

      num=struct.unpack(‘类型’,y)[0] 4bytes长度二进制反解成原数字,注意,反解出来的是个包含一个元素的

                       元组,含的这个元素就是转换前的数字,要使用就通过索引取出即可

        2)subprocess模块使用示列:

          r=subprocess.Popen( ‘cmd命令’ , shell=True,   #表示调用shell窗口去运行前面的命令

                                             stdout=subprocess.PIPE  #用来保存正确命令执行后的结果,结果为bytes类型

                                             stderr=subprocess.PIPE)  #用来保存错误命令执行后的结果,结果为bytes类型

          print(r.stdout.read().decode(‘gbk’))           #得到正确内容

          print(r.stderr.read().decode(‘gbk’))            #得到错误内容

  • 相关阅读:
    ArrayBlockingQueue和LinkedBlockingQueue
    hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了
    Hello World!
    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction;
    jquery的attr在浏览器发生错误,checkbox的属性总是为undefined
    如何解决设置maven时Could not read settings.xml
    iOS与HTML交互问题
    一个苹果证书怎么多次使用——导出p12文件
    Mac Chrome-点击书签页在新的标签打开之方法
    iOS 开发者中的个人账号与组织账号之间区别
  • 原文地址:https://www.cnblogs.com/quzq/p/9513738.html
Copyright © 2011-2022 走看看