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 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 1 网络编程 -> 正文阅读

[网络协议]1 网络编程

1 IP地址

1.1 说明
IP 地址分为两类: IPv4 和 IPv6
IPv4 是目前使用的ip地址
IPv6 是未来使用的ip地址
IPv4 是由点分十进制组成
IPv6 是由冒号十六进制组成

1.2 IP 地址的作用
IP 地址的作用是标识网络中唯一的一台设备的,也就是说通过IP地址能够找到网络中某台设备

1.3 查看 IP 地址
Linux 和 mac OS 使用 ifconfig 这个命令
Windows 使用 ipconfig 这个命令

1.4 检查网络是否正常
检查网络是否正常使用 ping 命令
ping www.baidu.com 检查是否能上公网
ping 当前局域网的ip地址 检查是否在同一个局域网内
ping 127.0.0.1 检查本地网卡是否正常

2 端口和端口号

2.1 端口
端口是传输数据的通道,是数据传输必经之路。
其实,每一个端口都会有一个对应的端口号,好比每个教室的门都有一个门牌号,想要找到端口通过端口号即可

2.2 端口号
操作系统为了统一管理这么多端口,就对端口进行了编号,这就是端口号,端口号其实就是一个数字,好比我们现实生活中的门牌号,
通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据传输给应用程序

2.3 端口号的分类
知名端口号:众所周知的端口号,范围从01023。FTP(文件传输协议:21, SMTP(简单邮件传输协议):25  HTTP:80
动态端口号:一般程序员开发应用程序使用端口号称为动态端口号, 范围是从102465535。
	如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
	当运行一个程序默认会有一个端口号,当这个程序退出时,所占用的这个端口号就会被释放。

3 TCP 和 socket

3.1 TCP 的概念
TCP 的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。

3.2 TCP 的特点
面向连接
	通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
可靠传输
	TCP 采用发送应答机制
	超时重传
	错误校验
	流量控制和阻塞管理

3.3 socket 的概念
socket (简称 套接字) 是进程之间通信一个工具,进程之间想要进行网络通信需要基于这个 socket

4 TCP 网络应用程序开发流程

4.1 TCP 网络应用程序开发分为
	TCP 客户端程序开发
	TCP 服务端程序开发

4.2 TCP 客户端程序开发流程的介绍
步骤说明:
	创建客户端套接字对象		socket()
	和服务端套接字建立连接	connect()
	发送数据					send()
	接收数据					recv()
	关闭客户端套接字	 		close()

4.3 TCP 服务端程序开发流程的介绍
步骤说明:
	创建服务端端套接字对象	socket()
	绑定端口号				bind()
	设置监听					listen()
	等待接受客户端的连接请求	accept()
	接收数据					recv()
	发送数据					send()
	关闭套接字				close()

5 TCP 客户端程序开发示例代码

import socket

if __name__ == '__main__':

    # 1 创建客户端套接字对象
    # AF_INET:表示ipv4    SOCK_STREAM: 表示tcp传输协议
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2 和服务端套接字建立连接
    tcp_client_socket.connect(("192.168.157.1", 8080))

    # 3 发送数据,二进制数据
    # windows的网络调试助手编码格式为gbk,mac lunix上面网络调试助手编码格式 utf-8
    content = "你好服务端,我是客户端小白!"
    content_data = content.encode("gbk")
    tcp_client_socket.send(content_data)

    # 4 接收数据
    # 1024表示单词最大传输1024字节
    recv_data = tcp_client_socket.recv(1024)
    recv_content = recv_data.decode("gbk")
    print("接受服务端的数据为:", recv_content)

    # 5 关闭客户端套接字
    tcp_client_socket.close()

6 TCP服务端程序开发

import socket


if __name__ == '__main__':
    # 1 建立服务端套接字
    # AF_INET:表示ipv4    SOCK_STREAM:表示tcp协议
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2 当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。
    # 设置端口号复用,让程序退出端口号立即释放
    # 参数1: 表示当前套接字  socket.SOL_SOCKET
    # 参数2: 设置端口号复用选项    socket.SO_REUSEADDR
    # 参数3: 设置端口号复用选项对应的值    True
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 3 绑定端口号
    # 第一个参数表示ip地址,一般不指定,表示本机的任何一个ip地址都可以
    # 第二个参数表示端口号
    tcp_server_socket.bind(("", 9090))

    # 4 设置监听
    # 128: 最大等待建立连接的个数,
    tcp_server_socket.listen(128)

    # 5 等待接受客户端的连接请求
    # server_client_socket 表示接收到的客户端套接字,和客户端通信是使用新的套接字server_client_socket
    # 每次连接 server_client_socket 的值都不一样,server_client_socket表示每个客户端的ip地址
    server_client_socket, ip_port = tcp_server_socket.accept()

    # 6 接收数据
    # 1024表示单次最大传输1024字节
    recv_data = server_client_socket.recv(1024)
    recv_content = recv_data.decode("gbk")
    print("接收到客户端的消息为:", recv_content)

    # 7 发送数据
    send_content = "你好,我是服务端"
    send_data = send_content.encode("gbk")
    server_client_socket.send(send_data)

	server_client_socket.close()

    # 8 关闭套接字
    tcp_server_socket.close()

7 TCP服务端程序升级版

# TCP服务器升级版,支持多客户,多频次的沟通

import socket
import threading


def handle_client_request(server_client_socket, ip_port):

    while True:
        # 6 接收数据
        # 1024表示单次最大传输1024字节
        recv_data = server_client_socket.recv(1024)

        # 如果从客户端接受的消息不为0,进行客户端交互
        if recv_data:
            recv_content = recv_data.decode("gbk")
            print(f"接收到{ip_port}客户端的消息为:", recv_content)

            # 7 发送数据
            send_content = input("服务端发送的消息:")
            send_data = send_content.encode("gbk")
            server_client_socket.send(send_data)

        else:
            print(f"客户端下线了,{ip_port}")
            break

    # 关闭服务器与客户端套接字,表示和客户端终止通信
    server_client_socket.close()


if __name__ == '__main__':
    # 1 建立服务端套接字
    # AF_INET:表示ipv4    SOCK_STREAM:表示tcp协议
    # tcp_server_socket 只负责等待接受客户端的连接需求,不用改套接字收发消息
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2 当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。
    # 设置端口号复用,让程序退出端口号立即释放
    # 参数1: 表示当前套接字  socket.SOL_SOCKET
    # 参数2: 设置端口号复用选项    socket.SO_REUSEADDR
    # 参数3: 设置端口号复用选项对应的值    True
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 3 绑定端口号
    # 第一个参数表示ip地址,一般不指定,表示本机的任何一个ip地址都可以
    # 第二个参数表示端口号
    tcp_server_socket.bind(("", 9090))

    # 4 设置监听
    # 128: 最大等待建立连接的个数,
    tcp_server_socket.listen(128)

    # 循环接受客户端与服务器之间建立连接
    while True:
        # 5 等待接受客户端的连接请求
        # server_client_socket 表示接收到的客户端套接字,和客户端通信是使用新的套接字server_client_socket
        # 每次连接 server_client_socket 的值都不一样,server_client_socket表示每个客户端的ip地址
        server_client_socket, ip_port = tcp_server_socket.accept()

        # 6 创建主线程,支持高并发,多客户同时多频次处理
        sub_thread = threading.Thread(target=handle_client_request, args=(server_client_socket, ip_port))
        # 设置守护主线程,主线程退出子线程直接销毁
        sub_thread.setDaemon(True)
        # 启动子线程执行对应的任务
        sub_thread.start()
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:47:35  更:2021-08-10 13:47:47 
 
开发: 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年5日历 -2024/5/19 11:14:10-

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