IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络笔记-2021/09/10-Socket基础知识 -> 正文阅读

[网络协议]计算机网络笔记-2021/09/10-Socket基础知识

ip地址和端口号

ip地址:用来唯一表示网络设备
端口号:主要区分主机上的不同应用

tcp和udp

tcp:
可靠传输,基于数据流的传输,自动检测并回传丢失数据包,发送和接收数据顺序一致,但是要求收发双方扮演不同角色,既客户端和服务端,服务端只能被动等待客户端连接,不会主动发起请求
在这里插入图片描述

udp:
不可靠传输,以报文为单位来收发数据,不会自动回传丢失的数据包因此不能保证对方能够接收到,正是缺少这些检查,udp通常具有更低的延迟并占用更少的系统资源,因此适用于视频语音通话等实时性较高的应用。
在这里插入图片描述

服务端

import socket
# with python 的语法糖,当离开with块时,执行s.close()来销毁socket4
# 参数1:socket.AF_INET 代表IPv4的地址家族 参数2 socket.SOCK_STREAM 代表使用tcp协议
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 用bind()函数将创建的socket关联到主机的某一个网卡和端口上
    # 其中网卡可以用ip地址指定,这里使用的时"0.0.0.0"特殊地址,代表主机上任意网卡都可以使用这个socket进行通信
    s.bind(("0.0.0.0", 1234))
    # 函数listen()将socket置为监听状态,等待客户端的连接
    s.listen()
    # 函数accept()等待任意客户端连接
    # 返回客户端c 和其 ip地址
    # socket s 主要用于监听,socket c 主要用于与连接的客户端通信
    c, addr = s.accept()
    with c:
        print(addr, 'connected') # 打印客户端的ip地址
        while True:
            # 此循环一直调用recv()函数接收客户端传来的消息 1024代表一次性接收最大长度1024字节
            data = c.recv(1024)
            # 只要不为空,就原封不动的将数据回传给客户端
            if not data:
                break
            c.sendall(data)

客户端

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

    # 直接connect 传入服务端的ip地址,和端口号
    s.connect(("127.0.0.1", 1234))
    # 向服务端发送数据,发送的不是字符串,而是一个字节序列,前面夹b
    s.sendall(b'hello, Ross!')
    # 调用recv()函数接收服务器的消息
    data = s.recv(1024)
    # 结果打印
    print('Received:', repr(data))

在这里插入图片描述

存在问题

这里的服务端只能处理一个客户端的请求,要并发与多个客户端进行通信有一下集中方法。

1. 多线程Socket服务器

import socket
import threading

def handle_client(c, addr):
    print(addr, 'connected.')
    while True:
        data = c.recv(1024)
        if not data:
            break
        c.sendall(data)


with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(('0.0.0.0', 1024))
    s.listen()

    while True:
        c, addr = s.accept()

        # 避免程序阻塞,创建一个新的线程,并将客户端的socket c 和地址传递给这个线程
        t = threading.Thread(target=handle_client, args=(c, addr))
        t.start()

在这里插入图片描述
多线程存在问题:
由于GIL存在,python本身不存在真正并发,并且线程自身也会占用额外的系统资源

2. selectors——高级I/O复用库

3. selectors——异步I/O

简单的HTTP应用

HTTP是TCP协议的一个典型应用,也是浏览器与服务器交互的主要方式,通常服务器会监听80端口等待客户端连接,客户端连接上服务器后,首先要确定要访问的资源,然后客户端会提供一系列额外信息,每一条以冒号分隔的键值对,也包括浏览器版本,称之为消息的头部,随后空行,然后是消息主体。
在这里插入图片描述
服务端会以同样方式,回应客户都安的请求。
首先是一行状态行,里面包含一个状态码,200代表请求成功
在这里插入图片描述
然后键值对,资源类型服务器信息等等
在后面是一个空行
最后面是消息主体

import socket
import threading
import os

WEBROOT = 'webroot'
def handle_client(c, addr):
    print(addr, 'connected!')
    # 读取客户端发来的消息
    with c:
        request = c.recv(1024)

        # Parse HTTP headers
        # 拆分成一行一行的字符串,存放在headers中,HTTP标准中定义的换行符'回车+换行'
        headers = request.split(b'\r\n')
        # 提取请求文件名
        file = headers[0].split()[1].decode()
        # Load file content
        # 若请求的是根路径,直接返回index.html文件
        if file == '/':
            file = '/index.html'

        # 读取文件的内容
        try:
            with open(WEBROOT + file, 'rb') as f:
                content = f.read()
            response = b'HTTP/1.0 200 OK\r\n\r\n' +content

        except FileNotFoundError:
            response = b'HTTP/1.0 404 NOT FOUND\r\n\r\nFile not found'

        # Send HTTP response
        c.sendall(response)

if __name__ == '__main__':
    # change working directory to script folder
    os.chdir(os.path.dirname((os.path.abspath(__file__))))
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind(('0.0.0.0', 80))
        s.listen()

        while True:
            c, addr = s.accept()
            # 避免程序阻塞,创建一个新的线程,并将客户端的socket c 和地址传递给这个线程
            t = threading.Thread(target=handle_client, args=(c, addr))
            t.start()

根路径
在这里插入图片描述
其他路径
在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:10:26  更:2021-09-11 19:10:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/28 6:08:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码