zoukankan      html  css  js  c++  java
  • python学习27天----网络基础

    1.网络开发架构

    1)C/S架构:客户端/服务端(client/server)

              C/S优点:客户端能充分发挥PC的性能

    2)B/S架构:浏览器/服务器(brower/server)隶属于C/S架构

                  B/S优点:统一了应用的接口

    2.网络通信

    1)同一个电脑两个py程序通信:2个py文件同时操作1个文件,一个读,一个写

    2)两个电脑通信

    3)多个电脑通信:局域网(交换机)---二层通信原理

    2.Socket(套接字)

    1)接口:别人写好的功能,自己去调用,这个功能的名字就是接口

    print(‘abc’)调用了系统中的标准输出,所以可以打印内容,即print调用了这个接口

    import sys
    print('abc')
    sys.stdout.write('abc')
    输出:
    abc
    abc
    View Code

    2)socket感念

                  Socket是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,他把复杂的TCP/IP协议隐藏在Socker接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议

    ①基于文件类型的套件字(AF_Unix):socket是源自于unix系统而研发的功能,主要是为了同一台电脑上,多个程序直接通信

    ②基于网络类型的套接字(AF_INET)

    3)socket层

    通信类的程序想要实现通信必须要调用Socket(里面提供了一系列的方法),根据业务不同的传输模式(tcp/udp),在编写程序过程中,只关注发送的程序和发送所需要的协议,其他不用关注

    4)协议类型(type)

    ①tcp:SOCK_STREAM

    ②udp: SOCK_DGRAM

    3.Socket

    1)服务端和客户端的连接

    #server.py
    import socket
    import  time
    sk = socket.socket()   #包.类  不传参数,默认使用基于网络的套接字,使用TCP模式
    #socket默认参数:family=AF_INET(基于网络的scoket), type=SOCK_STREAM(TCP模式), proto=0, fileno=None
    sk.bind(('192.168.43.223',18800)) #服务端的IP和开启的端口
    sk.listen() #监听,同时能接受的连接(即A能访问百度,B也能访问百度)
    print("连接前。。。")
    conn,addr = sk.accept() #等待接受客户端的连接,程序阻塞等待(之前的程序执行,之后的在客户端连接后执行)
    print("连接后。。。")
    print("conn:%s",conn)
    print("addr:%s",addr)
    time.sleep(20)
    conn.close()
    sk.close() #关闭连接
    #client.py
    import socket
    import time
    sk = socket.socket()
    sk.connect(('192.168.43.223',18800))
    time.sleep(20)
    sk.close()
    #输出:
    连接前。。。
    连接后。。。
    conn:%s <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.43.223', 18800), raddr=('192.168.43.223', 51742)>
    addr:%s ('192.168.43.223', 51742)
    View Code

    2)客户端和服务端的数据发送和接受

    #server.py
    import socket
    import  time
    sk = socket.socket()                 #买一个手机
    sk.bind(('192.168.43.223',18800))   #买一个手机卡
    sk.listen()                         #开机
    conn,addr = sk.accept() #等待连接     #等待朋友打电话
    str = conn.recv(1024) #等待接受服务器的大小,单位为字节   #
    str2 = conn.recv(1024)
    print(str.decode("utf-8"))
    # print(str2.decode("utf-8"))
    conn.close()                       #挂掉电话
    sk.close() #关闭连接                #关机
    #client.py
    import socket
    import time
    sk = socket.socket()
    sk.connect(('192.168.43.223',18800))
    sk.send(b"Hello World !!!") #客户端发送的数据必须为bytes类型,否则无法传输
    sk.send("你好,世界".encode("utf-8"))
    sk.close()
    #输出:
    Hello World !!!你好,世界
    View Code

    sk = socket.socket(family=AF_INET,type=SOCK_STREAM)

    4)协议类型(type)

    ①tcp:SOCK_STREAM

    ②udp: SOCK_DGRAM

    5)fimaly

    ①AF_unix

    ②AF_INET

    重点总结:

    ①arp协议

    ②路由器、交换机区别

    ③tcp协议和udp协议的特点及tcp协议的编码

    ④TCP/IP五层模型

    练习:

    1)客户端和服务端持续通信,当一段输入q时两端退出

    #server.py
    import socket
    import  time
    sk = socket.socket()
    sk.bind(('127.0.0.1',18800))
    sk.listen()
    conn,addr = sk.accept() #等待连接
    while True:
        str_out = conn.recv(2048).decode("utf-8") #等待接受数据的大小,单位为字节
        if str_out == 'q':
            break
        else:
            print(str_out)
        str_in = input(">>>")
        conn.send(str_in.encode("utf-8"))
        if str_in == "q":
            break
    conn.close()
    sk.close()
    #client.py
    import socket
    import time
    sk = socket.socket()
    sk.connect(('127.0.0.1',18800))
    while True:
        str_in = input(">>>")
        sk.send(str_in.encode("utf-8")) #客户端发送的数据必须为bytes类型,否则无法传输
        if str_in == 'q':
            break
        str_out= sk.recv(2048).decode("utf-8")
        print(str_out)
        if str_out=='q':
            break
    
    sk.close()
    View Code

    2)一个服务器轮流的和多个客户端进行通信(只需要在服务端加一个while循环即可)

    python.py
    import socket
    import  time
    sk = socket.socket()
    sk.bind(('127.0.0.1',18800))
    sk.listen()
    while 1:
        conn,addr = sk.accept() #等待连接
        while True:
            str_out = conn.recv(2048).decode("utf-8") #等待接受数据的大小,单位为字节
            if str_out == 'q':
                break
            else:
                print(str_out)
            str_in = input(">>>")
            conn.send(str_in.encode("utf-8"))
            if str_in == "q":
                break
        conn.close()
    sk.close()
    View Code
  • 相关阅读:
    Hadoop笔记
    InnoDB存储引擎概述--文件,表,索引,锁,事务的原理与实现
    SpringCloud-Eureka
    spring boot启动报错Error starting ApplicationContext(未能配置数据源)
    SSM框架配置
    SpringMvc笔记
    MySql笔记-->3
    MySql笔记-->2
    MySql笔记 -->1
    C# Lambda表达式
  • 原文地址:https://www.cnblogs.com/piaolaipiaoqu/p/14304271.html
Copyright © 2011-2022 走看看