zoukankan      html  css  js  c++  java
  • 第二十天

    网络编程
    """
    一、 计算机网络
    将地理位置不同的,具有独立功能的多态计算机及外部设备,
    通过通信线路连接起来,从而实现信息和资源共享的计算机系统。

    计算机网络分为七层结构:
    应用层 跟人贴近
    表示层
    会话层
    传输层
    网络层
    数据链路层
    物理层 跟计算机贴近
    """

    # 计算机的通信协议:是网络中计算机之间相互信息交流的一种规范,协议

    """
    1. http,ftp :应用层
    2. tcp udp :传输层
    tcp:点对点之间的协议。安全可靠的协议。
    三次握手: 客户端说:我可以跟你连接吗
    服务端说:可以
    客户端说:我知道了
    udp:无连接协议,非安全可靠的协议。寄快递。
    3. ip :网络层
    ip地址和端口号:
    在网络连接中,确定网络地址独一无二,ip。
    192.168.0.1 ===32个数据位。

    端口号:一台计算机可能启动很多程序,多个进程,使用不同的端口号进行服务。
    16位,

    4. 硬件设备相关的协议
    """

    """
    二、url
    url:统一资源定位。
    url:两个部分:
    协议标识符、资源的名称
    http(协议标识符)://www.baidu.com(资源名称)------注册好的域名

    192.168.0.1:8080-----真正的访问地址

    """

    """
    解析url
    在python中使用urlparse函数,在urllib下,解析的结果可以分为六部分(元组):
    协议、网络地址、路径、路径的参数、查询的参数、引用片段
    特殊的ip:127.0.0.1(localhost):本地ip,本地回环地址。

    """
    # 定义一个典型的地址
    from urllib.parse import urlparse
    # 定义一个 典型的地址
    url="http://127.0.0.1:9900/abc/index.html?name=admin&password=123"
    result=urlparse(url)
    print(result)
    print(result[2])

    发送请求
    urllib.request模块的方法
    # 两种方式
    1. urlopen(url)
    from urllib.request import urlopen,urlretrieve
    urlopen向网络发起请求,参数指定url,返回值是一个响应对象,响应对象里包含服务器回应的信息
    response=urlopen("http://www.sina.com.cn/")
    # 服务器返回的内容,以字节形式返回
    html=response.read()
    html=html.decode()
    print(html)
    with open("d:/downloadfromsina.txt","wt") as f:
    f.write(html)

    responseBaidu=urlopen("https://www.baidu.com/img/xinshouye_1aa582c0b96d57852497a8bbc4345f15.png")
    with open("c:/baidu.Pic.png","wb") as f:
    f.write(responseBaidu.read())


    # 伪造地址
    responseBaidu=urlopen("file:///d:/abc.png")
    with open("c:/abc.png","wb") as f:
    f.write(responseBaidu.read())

    2.urlretrieve直接将url定位的资源down
    第一个参数:url
    第二个参数:本地保存的地址
    urlretrieve("https://www.baidu.com/img/xinshouye_1aa582c0b96d57852497a8bbc4345f15.png","c:/abc/baidu.Pic.png")


    # 案例:可以对某一个地址下所有链接进行抓取
    import re
    url="https://www.csdn.net/"
    rep=urlopen("https://www.csdn.net/")
    content=rep.read().decode()
    print(content)
    res_url=r"<a.*?href="(https://.*?".*?</a>"
    urls=re.findall(res_url,content,re.DOTALL|re.MULTILINE|re.IGNORECASE)
    for u in urls:
        print(u)
    三、socket编程
    """
    socket编程(套接字)
    socket可以看成是连接点,每一个连接点都是一个socket
    """
    # 使用socket编程实现客户端和服务端
    """
    tcp 服务端

    客户端发请求,socket
    服务端监控请求,socket
    当服务端监控有请求的时候,会产生一个新的socket,跟客户端进行沟通
    """
    import socket
    import threading
    # 接受信息
    def read(s):
    while True:
    print(s.recv(1024).decode())
    # 发送信息
    def write(s):
    while True:
    s.sendall(input().encode())

    if __name__=="__main__":
    # 创建socket
    # 第一个参数:地址族
    # 第二个参数是通信的类型,TCP:socket.SOCK_STREAM,UDP
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 名字:bind绑定ip和端口,告诉外界,你的连接地址,注意传入一个元组
    s.bind(("127.0.0.1",8888))

    # 对客户端进行监听
    s.listen()

    # 如果客户端发送了请求,可以使用accept接受请求
    # accept函数可以返回两个内容:
    # 第一个新的socket(用来跟客户进行沟通)
    # 第二个远程的ip地址(客户端)
    so,addr=s.accept()
    print(so)
    print(addr)

    # 接受从客户端发送过来的信息
    # recv可以接受内容(字节),可以指定参数来指定接受的最大字节
    # recv在接受信息时,会一直处于阻塞状态。
    content=so.recv(1024)
    print(content.decode())

    # 服务端向客户端发送信息
    so.sendall(input("服务端说:").encode())
    # 目前只能说一句话
    while True:
    content=so.recv(1024)
    print(content.decode())
    content=input("服务端说:")
    so.sendall(content.encode())
    if content=="exit":
    break
    # 接受文件
    b=bytes()
    with open("d:/abc.txt","wb") as f:
    while True:
    data=so.recv(10)
    if not data:
    break
    # b+=data
    f.write(data)


    t1=threading.Thread(target=read,args=(so,))
    t2=threading.Thread(target=write,args=(so,))
    t1.start()
    t2.start()
    tcp 客户端
    # 新创建连接点socket
    import socket
    import threading
    from day20.tcpserver import read,write
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 建立连接,发送请求
    # connect方法建立连接,传入元组(ip,端口号),服务器地址
    s.connect(("127.0.0.1",8888))

    # 发送信息
    s.sendall("发送一条信息".encode())
    while True:
    content=input("客户端说:")
    s.sendall(content.encode())
    if content=="exit":
    break
    # 客户端接受从服务端传递过来的信息
    print(s.recv(1024).decode())

    # 传送文件
    with open("c:/abc.txt","rb") as f:
    s.sendfile(f)

    t3=threading.Thread(target=read,args=(s,))
    t4=threading.Thread(target=write,args=(s,))
    t3.start()
    t4.start()

    udp 服务端
    # udp服务端 不适合发送精准内容,不安全,也没有保障的协议。
    # udp速度很快,适合超时之后,服务端就不需要接受。
    # udp不需要进行监听
    import socket
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.bind(("127.0.0.1",8888))
    print(s.recv(1024).decode())

    udp 客户端
    import socket
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # udp在客户端也不需要连接。
    s.sendto("不需要连接,之间发送".encode(),(("127.0.0.1",8888)))
     
  • 相关阅读:
    致亲爱的304
    C语言中简单的for循环和浮点型变量
    C程序内存管理
    变量
    我哭了
    那一场邂逅
    如何修改安卓项目的图标
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法
    Android 异步加载
    大家好,第一次用博客记录一些东西
  • 原文地址:https://www.cnblogs.com/ztx695911088/p/9247174.html
Copyright © 2011-2022 走看看