美文网首页
网络编程

网络编程

作者: pubalabala | 来源:发表于2018-08-07 16:39 被阅读0次
    • OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

    • TCP/IP协议(栈/簇):OSI参考模型中涉及得所有协议
      HTTP、TCP和UDP(HTTP是基于TCP的,DNS基于UDP)

    • TCP:可靠传输、建立会话、大数据可以分段传输(可以实现长连接)

    • UDP:不可靠传输、不会建立会话(不是长连接)、数据一次传完,不会分段

    • HTTP:给客户端发送的请求和服务器的响应醉了规范和要求.

      • 请求:需要发送请求头和请求体
      • 响应:需要返回响应头和响应体
    • URL:统一资源定位符
      协议命://主机地址(ip地址,域名)/路径(资源在服务器上的相对路径)

    • GET和POST:对参数的传输方式不一样

    • socket:写服务端(船舰服务端对应的套接字→绑定ip和端口→监听---接收请求,TCP建立会话,发送和接受数据)
      写客户端(创建客户端对应的套接字→连接服务器---发送和接收数据)

    • requests模块,第三方模块.

    socketServer

    """__author__ == Jefferson"""
    '''
    socket编程(套接字): 指通过代码来创建实现通信的两个端, (服务器和客户端)
    socket一般可以基于TCP和UDP实现客户端和服务器之间的可靠传输和不可靠传输
    
    python中的内置模块socket可以支持socket编程
    
    '''
    import socket
    
    
    if __name__ == '__main__':
        #1. 创建服务器套接字对象
        '''
        family: 确定服务类型
            AF_INET: ipv4(默认)
            AF_INET6: ipv6                           
        
        type: 确定传输协议类型
            SOCK_STREAM: TCP协议(默认)
            SOCK_DGRAM: UDP协议
        
        
        
        '''
        #server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
        server = socket.socket()
    
        #2. 绑定ip地址和端口
        '''
        地址格式: ('ip地址字符串', 端口号)
        端口号: 用来区分计算机中不同的服务, 范围是0-65535
        注意: 1. 其中0-1024是'著名端口'用来便绑定一些特殊服务, 平时一般不使用
            2. 同一时间, 一个端口只能绑定一个服务
        
        
        '''
        server.bind(('10.7.181.85', 8080))
    
        #3. 监听请求
        '''
        参数: 用来限制一次性能够接收的客户端请求数量
        
        '''
        server. listen(30)
        print('开始监听请求')
        #保证服务器一直处于启动状态
        while True:
            #4. 接收客户端的请求
            '''
            accept()会阻塞线程, 直到有客户端给这个服务器发送请求, 才会开始执行
            '''
            client, addr = server.accept()
            print(addr)
    
            #5. 给客户端发送消息
            '''
            send(数据): 数据必须是二进制(bytes)类型
            字符串转二进制:
            1. bytes('字符串',encoding='编码方式')
            2. 字符串.encode(encoding='编码方式'
            '''
    
            with open('./2.jpg', 'rb') as file:
                data = file.read()
    
            client.send(data)
            # client.send(bytes('HTTP/1.1 200 0K\r\n\r\n',encoding='utf-8'))
            # client.send(bytes("I'm PSL, I will control you equipment!",encoding='utf-8'))
    
            #接收从客户端发来的消息
            '''
            bufsize: 设置缓存大小(单位是字节)
            1024字节
            
            二进制转换成字符串
            1. str(二进制数据,encoding='utf-8)
            2. data.decode(encoding='utf-8')
            '''
            # data = client.recv(1024)
            # str1 = str(data, encoding='utf-8')
            # str2 = data.decodde(encoding='utf-8')
            # print(str1)
    
            #6. 关闭连接
            client.close()
    

    socketClient

    """__author__ == Jefferson"""
    import socket
    if __name__ == '__main__':
        #1. 创建套接字对象
        client = socket.socket()
    
        #2. 连接服务器
        client.connect(('10.7.181.85', 8080))
    
        #3. 接收信息
        # data = client.recv(1024)
        # print('接收到服务器的数据:', data.decode(encoding='utf-8'))
    
        img = bytes()
        img_data = client.recv(1024)
        while img_data:
            img += img_data
            img_data = client.recv(1024)
    
        with open('./21.jpg','wb') as file:
            file.write(img)
    
        #4. 发送消息
        client.send('你好服务器'.encode(encoding='utf-8'))
    
        client.close()
    

    两人互发信息
    server

    """__author__ == Jefferson"""
    import socket
    if __name__ == '__main__':
        #1. 创建对象
        server = socket.socket()
    
        #2. 绑定地址
        server.bind(('10.7.181.85', 8089))
    
        #3. 监听
        server.listen(50)
        while True:
            conversation, addr = server.accept()
            print(addr)
            #让客户端和服务器一直处于连接的状态
            while True:
                #发消息
                message = input('>>>')
                conversation.send(message.encode())
    
                #接收消息
                mesasge_data = conversation.recv(1024)
                print(mesasge_data.decode(encoding='utf-8'))
    

    client

    """__author__ == Jefferson"""
    import socket
    if __name__ == '__main__':
        #1. 创建套接字对象
        client = socket.socket()
    
        #2. 连接服务器
        client.connect(('10.7.181.92',8085))
    
        while True:
            # 接收消息
            data = client.recv(1024)
            print(data.decode(encoding='utf-8'))
    
            # 发送消息
            message = input('>>>')
            client.send(message.encode())
    
    

    http

    """__author__ == Jefferson"""
    '''
    服务器:python\java\php等等
    
    HTTP(为了可以让客户端和服务器能够进行有效的数据交流)
    
    客户端: 网页(js), 应用(java, oc/swift)
    
    python中访问网络中的数据: 第三方库request
    
    
    '''
    from requests import request
    
    if __name__ == '__main__':
        #1. 确定url  https://www.apiopen.top/satinApi?type=1&page=1
        #GET请求: 参数以?的形式拼接到url地址后面, 参数名=值得形式,多个参数用&隔开
        url = 'https://www.apiopen.top/satinApi?type=1&page=1'
    
        #2. 发送请求
        response = request('GET', url)
        print(type(response),response)
    
        #以字符串的形式获取响应体(服务器返回的数据)
        text = response.text
        print(type(text),text)
    
        #以json的形式获取响应体
        json =response.json()
        print(type(json),json)
    
        #以二进制的形式获取响应体
        content = response.content
        print(type(content),content)
    
    

    练习

    server

    """__author__ == Jefferson"""
    import socket
    import re
    from requests import request
    
    if __name__ == '__main__':
        server = socket.socket()
    
        server.bind(('10.7.181.85',8080))
    
        server.listen()
    
        while True:
    
            conversation, address = server.accept()
    
            print(address,'已连接')
            while True:
                # 接收消息
                message_a = conversation.recv(1024)
                message_a = message_a.decode(encoding='utf-8')
                re_str = r'(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?'
                web_match = re.fullmatch(re_str+' ',message_a)
    
                if web_match != None:
                    response = request('GET', web_match.group()[:-1])
                    re_str = r'.+\.(JPG|JPEG|GIF|PNG|jpg|jpeg|gif|png)'
                    img_match = re.fullmatch(re_str + ' ', message_a)
                    if img_match != None:
                        print(img_match.group())
                        with open('./file/'+re.search(r'[^\%]\w+\.\w+ ', img_match.group()).group()[:-1], 'wb') as file:
                            file.write(response.content)
                    else:
                        print(web_match.group())
                        with open('./file/text.txt','w') as file:
                            file.write(response.text)
    
                print(message_a)
    
                #发消息
                message = input('>>>')
                conversation.send(message.encode())
    

    client

    """__author__ == Jefferson"""
    import socket
    if __name__ == '__main__':
        client = socket.socket()
    
        client.connect(('10.7.181.85',8080))
    
        while True:
    
            # 发送消息
            message_a = input('>>>')
            client.send(message_a.encode())
            if message_a == '拜拜':
                break
    
            #接收消息
            message = client.recv(1024)
            print(message.decode(encoding='utf-8'))
    
        client.close()
    
    

    相关文章

      网友评论

          本文标题:网络编程

          本文链接:https://www.haomeiwen.com/subject/kpeavftx.html