python笔记——网络编程

目录

1.网络编程

1.1 套接字socket

tcp客服端 or tcp服务单个的服务端:

tcp客服端 or tcp服务多个的服务端:

1.2 web服务器

1.http协议

2.web服务器的访问

3.URL

3.1 url的组成:

4.控制台

5.web服务器搭建


1.网络编程

1. ip地址

ip地址:Python网络编程基础之ip地址,端口号,TCP,socket_pyrhon 进程 端口号-CSDN博客

IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 I

它的表现形式有:

  • ipv4:由点分十进制组成
  • ipv6:由冒号十六进制组成

如:

ip地址查看命令

  • Linux 和 mac OS 使用 ifconfig
  •  windows 使用 ipconfig

检查网络是否正常: ping + IP地址 或 域名

 端口号分类

  • 知名端口号:指众所周知的端口号,一般固定分配给一些系统服务进程,范围从0到1023。
  • 动态端口号:开发应用程序可以使用的端口号,运行一个程序默认会有(无会生成)一个端口号,且没特殊绑定的话,退出后这个端口会被释放,范围是从1024到65535。

TCP协议 (Transmission Control Protocol),即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

tcp特点:

1. 面向连接                

  • 通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。

2. 可靠传输:

  • TCP 采用发送应答机制(三次握手建立连接,四次握手断开连接)
  • 超时重传
  • 错误校验
  • 流量控制和阻塞管理

tcp/ip协议:

图片来源:Python网络编程——TCP/IP协议_python 实现与网口通讯继电器的链接-CSDN博客

套接字:实现数据传输

2.python提供的基本socket模块包括:

  • socket:提供标准的BSD Sockets API
  • SocketServer:提供服务器中心类,可以简化网络服务器的开发

1.1 套接字socket

s = socket.socket (socket_family, socket_type, protocol = 0)
  • socket_family - 它的值可以是:AF_UNIXAF_INET,如前所述。
  • socket_type - 它的值可以是:SOCK_STREAMSOCK_DGRAM
  • protocol - 这通常被省略,默认为0

 常用函数如下:

 

图片:Python网络编程-CSDN博客

tcp客服端 or tcp服务单个的服务端:

import socket
class cl_socket():
    def cl_socket_Server(self):
        # AF_INET6:ipv6  SOCK_STREAM:TCP协议
        tcp_Server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #创建服务端套接字
        #  设置端口号复用,服务器程序退出端口号释放
        # SOL_SOCKET 表示当前套接字
        # SO_REUSEADDR 表示复用端口号选项
        # TRUE 确定复用
        tcp_Server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        #参数1,ip地址:一般不用指定,表示本机的任何一个IP即可
        #参数2,端口号
        tcp_Server_socket.bind(("192.168.1.2",8080))  #绑定端口号
        #128表示最大等待建立个数
        tcp_Server_socket.listen(128)  #设置监听
        new_client, ip_port = tcp_Server_socket.accept()  #阻塞
        print("客服端的ip和端口号为:",ip_port)
        recv_data = new_client.recv(1024)  #接收(请求)
        recv_server = recv_data.decode("gbk")
        send_connect = "问题正在处理中...\n\n"
        send_server = send_connect.encode("gbk")
        new_client.send(send_server)

        running = 1
        while running:
            send_data = "hello, 我是小白"
            send_server = send_data.encode("gbk")
            new_client.send(send_server)  #发送(应答)
            recv_data = new_client.recv(1024)
            recv_server = recv_data.decode("gbk")
            print("客户端发送的数据为:",recv_server)
            if recv_server == "Close":
                tcp_Server_socket.close()
                running = 0
        return recv_server

    def cl_socket_Client(self):
        # 创建客户端套接字
        # AF_INET:ipv4  SOCK_STREAM:TCP协议
        tcp_CLient_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        tcp_CLient_socket.connect(("192.168.1.2",8080))  #建立连接(TCP三次握手)
        send_connect = "hello, 我是小白"
        send_data = send_connect.encode("gbk")
        tcp_CLient_socket.send(send_data)  # 发送(请求) 二进制数据
        rect_data = tcp_CLient_socket.recv(1024)  # 接收(应答)
        rect_connect = rect_data.decode("gbk")
        tcp_CLient_socket.close()  #关闭客户端套接字
        return rect_connect

if __name__ == "__main__":
    running = 1
    run_Client = 0
    while running:
        printf = False
        if run_Client:
            data = cl_socket.cl_socket_Client(cl_socket)
            data_1 = "接收服务端数据为:"
            printf = True
        else:
            data = cl_socket.cl_socket_Server(cl_socket)
            data_1 = "接收客户端数据为:"
            printf = True
        if printf:
            if run_Client:
                print("发送成功!")
                print(f"{data_1}"+ str(data))
            else:
                print(f"{data_1}"+str(data))
                print("接收成功!")

网络调试助手:NetAssist网络调试助手-软件工具-野人家园 (cmsoft.cn)

tcp客服端 or tcp服务多个的服务端:

import socket,threading,time

class cl_socket():
    def __init__(self):
        self.data1 = ""
        self.lst_new_client = []

    def cl_Server_go(self,new_client,ip_port):
        while True:
            time.sleep(0.1)
            data = new_client.recv(1024)  # 接收(应答)
            data = data.decode("gbk")
            #print(lst_client_1)
            if data == "":
                break
            else:
                print(f"{ip_port} 说:{data}")
            if data == "exit":
                self.lst_new_client.remove(new_client)
                print(f"{ip_port} 退出了聊天室")
                new_client.close()  # 关闭客户端套接字
                break
            threading.Thread(target=self.self_input,args=(new_client,)).start()
            if self.data1 == "exit":
                print(f"{ip_port} 退出聊天室")
                new_client.close()  # 关闭客户端套接字

    def self_input(self,new_client):
        while True:
            try:
                self.data1 =  input("")
            except:
                self.data1 = "exit"
                break
            if self.lst_new_client:
                for new_client1 in self.lst_new_client:
                    new_client1.send(self.data1.encode("gbk"))  # 发送(请求)
            else:
                new_client.send(self.data1.encode("gbk"))  # 发送(请求)


    def cl_socket_Server(self,):

        # 创建服务端套接字
        # AF_INET:ipv4  SOCK_STREAM:TCP协议
        tcp_Server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        tcp_Server_socket.bind(("192.168.1.2",8080))  #绑定端口
        tcp_Server_socket.listen(5)  #监听
        print("等待客户端连接...")

        while True:
            new_client,ip_port = tcp_Server_socket.accept()  # 建立连接(TCP三次握手)
            if new_client:
                self.lst_new_client.append(new_client)
            print(f"{ip_port} 连接成功!")
            # 创建线程
            threading_1 = threading.Thread(target=self.cl_Server_go,args=(new_client,ip_port))
            threading_1.daemon = True
            threading_1.start()

    def cl_socket_Client(self):
        try:
            # 创建客户端套接字
            # AF_INET:ipv4  SOCK_STREAM:TCP协议
            tcp_CLient_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            tcp_CLient_socket.connect(("192.168.1.2",8080))  #建立连接(TCP三次握手)
            send_connect = "hello, 我是小白"
            send_data = send_connect.encode("gbk")
            tcp_CLient_socket.send(send_data)  # 发送(请求) 二进制数据
            rect_data = tcp_CLient_socket.recv(1024)  # 接收(应答)
            rect_connect = rect_data.decode("gbk")
            tcp_CLient_socket.close()  #关闭客户端套接字
            return rect_connect
        except:
            tcp_CLient_socket.close()  #关闭客户端套接字
            return "连接失败!对方可能不在线!"

if __name__ == "__main__":
    running = 1
    run_Client = 1
    cl_socket = cl_socket()
    while running:
        printf = False
        if run_Client:
            data = cl_socket.cl_socket_Client()
            data_1 = "接收服务端数据为:"
            printf = True
            if data == "连接失败!对方可能不在线!":
                data_1 = "error:"
                running = 0
        else:
            data = cl_socket.cl_socket_Server()
            data_1 = "接收客户端数据为:"
            printf = True
        if printf:
            if run_Client:
                print(f"{data_1}"+ str(data))
            else:
                print(f"{data_1}"+str(data))
                print("接收成功!")

1.2 web服务器

多线程web服务器:python实现多线程web服务器_python web 线程-CSDN博客

TCP:Python网络编程-TCP(基于socket)_python3 tcp使用什么库-CSDN博客 

1.http协议

http协议介绍:【Python入门】45.Web开发之 HTTP协议简介-CSDN博客

http协议介绍:

HTTP协议(Hyper Text Transfer Protocol),字面意思为超文本传输协议。是浏览器与服务器之间的传输协议。

用户通过浏览器向服务器发送HTTP请求信息(Request),服务器收到请求后,向浏览器发送响应信息(Response)

HTTP协议是基于TCP传输协议传输数据的,同时也规定了浏览器和web服务器的通讯数据格式

2.web服务器的访问

3.URL

url: 网络编程_概念_网络_端口_URL_TCP_UDPJAVA184_计算机网络技术8080端口-CSDN博客

URL 代表着是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。而在实际中,也有一些例外,最常见的情况就是一个 URL 指向了不存在的或是被移动过的资源。由于通过 URL 呈现的资源和 URL 本身由 Web 服务器处理,因此 web 服务器的拥有者需要认真地维护资源以及与它关联的 URL。

3.1 url的组成:

url的组成:一个网址(URL)有哪些部分组成?域名包括哪些?_网址的组成-CSDN博客

URL结构:

<协议>://<域名>/<路径>?<查询参数>#<片段标识符>

如:https://passport.csdn.net/login/1111111?code=applets&count=1(无效网址)

协议(Protocol):表示访问网页时使用的通信协议。如:https://

域名(Domain Name):表示网站的名称。如:passport.csdn.net

端口号(Port):表示用于访问网站的端口号

路径(Path):表示网站上具体的文件或目录路径,如:/login/1111111

查询参数(Query Parameters):表示向服务器传递的参数。如:?code=applets&count=1

片段标识符(Fragment Identifier):片段标识符用于指定页面中的特定部分,通常以#开头。例如,在https://www.example.com/article#section2中,#section2就是片段标识符,它告诉浏览器直接跳转到文章的第二节

4.控制台

 控制台可以使用js代码

请求与响应标头位置:(在浏览器界面中)右键->检查->网络->img->第一个图片->标头

  下文详细:http协议基础教程-百度开发者中心 (baidu.com)

HTTP请求

1.请求行

请求方法(Method):

  1. GET:请求获取Request_url所标识的资源(常用:获取数据)
  2. POST:在在Request-URI所标识的资源后附加新的数据(常用:提交表单)
  3. HEAD:请求获取由Request-URI所标识的资源的响应消息报头
  4. PUT:请求服务器存储一个资源,并用Request-URI作为其标识
  5. DELETE:请求服务器删除Request-URI所标识的资源
  6. TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
  7. CONNECT:保留将来使用
  8. OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求

2.消息报头

  1. 普通报头:有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
  2. 请求报头:请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
  3. 响应报头:响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
  4. 实体报头:请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。

3.请求正文(百度检查)

HEET响应:

状态码:

  • 1xx:指示信息—表示请求已接收,继续处理
  • 2xx:成功—表示请求已被成功接收、理解、接受
  • 3xx:重定向—要完成请求必须进行更进一步的操作
  • 4xx:客户端错误—请求有语法错误或请求无法实现
  • 5xx:服务器端错误—服务器未能实现合法的请求

常见状态码:

  • 200 OK //客户端请求成功
  • 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403 Forbidden //服务器收到请求,但是拒绝提供服务
  • 404 Not Found //请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error //服务器发生不可预期的错误
  • 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

例:HTTP/1.1 200 OK (CRLF)

        HTTP/1.1 200 OK (from disk cache)

(CRLF):表示消息报头已结束

(from disk cache):从磁盘缓存,详1:从from disk cache看浏览器缓存机制-CSDN博客

                       详2:浏览器缓存:从内存与磁盘的深度解析-百度开发者中心 (baidu.com)

5.web服务器搭建

下一篇中,地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值