2018-08-07 day17 网络编程基础以及socket

socket 服务器

socket编程(套接字):指的是通过代码来创建实现通信的两个端(服务器和客户端)

socket一般可以基于TCP和UDP实现客户端和服务器之间的可靠传输和不可靠传输

python中的内置模块socket可以支持socket编程

  • 导入socket包
import socket

通过socket实现服务器端功能

  • 1.创建服务器套接字对象
  • 2.绑定ip地址和端口
  • 3.监听请求
  • 4.接收客户端的请求
  • 5.给客户端发送信息
  • 6.关闭连接

1.创建服务器套接字对象

  • family:确定服务类型 AF_INET → ipv4
    AF_INET6 → ipv6

  • type:确定传输协议类型

  • SOCK_STREAM → TCP协议

  • SOCK_DGRAM → UDP协议

# server = socket.socket(family=socket.AF_INET, type=SOCK_STREAM)
server = socket.socket()

2.绑定ip地址和端口

  • 地址格式:(IP地址字符串,端口号)

  • 端口号是用来区分一个计算机中不同的服务,范围是0-65535

  • 注意:

    1. 其中0-1024是'著名端口'用来绑定一些他特殊的服务,一般不适用
    1. 同一时间一个端口只能绑定一个服务
server.bind(('10.7.181.92', 8080))

3.监听请求

  • 参数:用来限制一次性能够接收的客户端请求数量

server.listen(20)
# 保证服务器一直处于一直启动的状态
while True:

4.接收客户端的请求

  • accept():会阻塞线程,当有客户端给这个服务器发送请求才会执行

client, addr = server.accept()
print(addr)

5.给客户端发送信息

  • send(数据):数据必须是二进制数据(bytes)类型

  • 字符串转二进制:

    1. bytes(字符串,encoding = 编码方式)
    2. 字符串.encode()可以加上参数'utf-8'
# client.send('HTTP/1.1 200 OK\r\n\r\n', encoding='utf-8')
str1 = input()
client.send(bytes(str1, encoding='utf-8'))
  • 从客户端接收消息

    • bufsize:设置缓存大小(单位是字节)
  • 二进制(bytes)转字符串

    1. str(二进制数据,encoding = 'utf-8') // 强制转换
    2. 二进制.decode(encoding = 'utf-8')
data = client.recv(1024)
str1 = data.decode(encoding='utf-8')
print(str1)

6.关闭连接

client.close()

socket 客户端

1.创建套接字对象

client = socket.socket()

2.连接服务器

client.connect(('10.7.181.85', 8080))

3.接收信息

data = client.recv(1024)
print(data.decode(encoding='utf-8'))
str1 = input()

4.发送数据

client.send(str1.encode(encoding='utf-8'))

http 协议

  • 服务器:(python)\java\php

  • HTTP(为了可以让客户端和服务器额能够进行有效的数据交流)

  • python中访问网络中的数据:第三方库request

导入第三方库

from requests import request

# https://www.apiopen.top/satinApi?type=1&page=1
# GET请求:参数以?形式拼接到url地址后面,参数名=值得形式,多个参数用&隔开

1.确定url

url = 'https://www.apiopen.top/satinApi?type=1&page=1'

2.发送请求

  • request(请求方式,地址)

  • 返回值:响应

response = request('GET', url)
print(type(response), response)
  • 1.以字符串形式获取相应提(服务器返回得数据)
text = response.text
print(type(text), text)
  • 2.以json形式获取响应体
json = response.json()
print(type(json), json)
  • 3.以二进制形式获取响应体
content = response.content
print(type(content), content)

作业

client.py

import socket
import os


def main():

    ip = '10.7.181.92'
    os.chdir('D:/MyCourse/Cultivate/Part2-NetworkProgram/day01-网络编程')
    client = socket.socket()
    client.connect((ip, 8089))
    print('welcome to contact me')
    while True:
        # 发送信息
        reply = input('>>>').encode()
        client.send(reply)
        # https://blazepress.com/.image/t_share/MTQxMzU1NzI2ODg2Njc2Mjkx/jannik-obenhof-travel-photography-instagram-18jpg.jpg
        content = client.recv(1024)
        print(content.decode(encoding='utf-8'))


if __name__ == '__main__':
    main()

server.py

'''
写一个两个人的聊天系统,可以实现双向聊天功能。
# 如果发送的是普通的文字就直接打印,如果发送的文字是’拜拜’就关闭连接,
# 如果是一个网络地址就获取数据(保存到文本文件中),如果是图片地址就下载图片到本地
'''
import socket
import re
from requests import request
import os


def main():
    server = socket.socket()
    ip = '10.7.181.92'
    server.bind((ip, 8089))
    server.listen(10)
    reUrl = r'https?://\w+\.\w+(\.\w+)?[\w\-/&%^$@#!.]+'
    os.chdir('D:/MyCourse/Cultivate/Part2-NetworkProgram/day01-网络编程')
    while True:
        serverM, addr = server.accept()
        print(addr)
        while True:
            msg = serverM.recv(1024).decode(encoding='utf-8')
            # 接收
            if re.fullmatch(reUrl, msg):
                if re.findall(r'\.(jpg|jpeg|png|bmp|gif|ico|tif)$', msg):
                    response = request('GET', msg)
                    img = response.content
                    with open('./Case/999.jpg', 'wb') as f:
                        f.write(img)
                    serverM.send('收到!!'.encode())
                else:
                    response = request('GET', msg)
                    json = response.json()
                    with open('./Case/333.json', 'wb') as f:
                        f.write(json)
                    serverM.send('收到!!'.encode())
            else:
                print(msg)
            content = input('>>>').encode()
            serverM.send(content)


if __name__ == '__main__':
    main()

你可能感兴趣的:(2018-08-07 day17 网络编程基础以及socket)