网络传输数据

网络

IP:
IP地址是标识网络中设备的一个地址
作用:
标识网络中唯一一台设备

端口:
传输数据的通道
知名端口号:
21:FTP文件传输协议
25:SMTP简单邮件传输协议
80:HTTP协议

TCP:
传输控制协议,数据不能随便传输,需要遵循某种协议,保证程序之间按照指定的传输规则进行数据的通信。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP通信步骤:
创建连接
传输数据
关闭连接

socket:
socket是进程之间通信的一个工具,进程之间想要进行网络通信需要基于socket
作用:
负责进程之间的网络数据传输,好比数据的搬运工

TCP网络应用程序开发流程

TCP客户端程序开发(QQ)
TCP服务端程序开发(QQ的服务器)

客户端开发步骤:
创建客户端套接字对象
和服务端套接字建立连接
发送数据
接受数据
关闭客户端套接字

服务端开发步骤:
创建服务端套接字对象
绑定端口号
设置监听
等待接受客户端的连接请求
接受数据
发送数据
关闭套接字

注意点:
service_client_socket, ip_port = tcp_server_socket.accept()
service_client_socket:新的套接字,专门和客户端进行通信
服务端listen后的套接字是被动套接字,只负责接受新的客户端的连接请求,不能收发消息
当客户端和服务端连接成功后,TCP服务端会产生一个新的套接字,收发客户端消息

send、recv原理:
send和recv都不是直接接受到数据或者发送数据,都是需要从缓存区获取数据或者发送数据。发送和接受数据最终是由操作系统控制网卡来完成

多任务版TCP服务端程序

# 使用线程,循环等待接受客户端连接请求

import socket
import threading


# 处理客户端的请求操作
def handle_client_request(service_client_socket, ip_port):
    # 循环接收客户端发送的数据
    while True:
        # 接收客户端发送的数据
        recv_data = service_client_socket.recv(1024)
        # 容器类型判断是否有数据可以直接使用if语句进行判断,如果容器类型里面有数据表示条件成立,否则条件失败
        # 容器类型: 列表、字典、元组、字符串、set、range、二进制数据
        if recv_data:
            print(recv_data.decode("gbk"), ip_port)
            # 回复
            service_client_socket.send("ok,问题正在处理中...".encode("gbk"))

        else:
            print("客户端下线了:", ip_port)
            break
    # 终止和客户端进行通信
    service_client_socket.close()


if __name__ == '__main__':
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用,让程序退出端口号立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9090))
    # 设置监听, listen后的套接字是被动套接字,只负责接收客户端的连接请求
    tcp_server_socket.listen(128)
    # 循环等待接收客户端的连接请求
    while True:
        # 等待接收客户端的连接请求
        service_client_socket, ip_port = tcp_server_socket.accept()
        print("客户端连接成功:", ip_port)
        # 当客户端和服务端建立连接成功以后,需要创建一个子线程,不同子线程负责接收不同客户端的消息
        sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))
        # 设置守护主线程
        sub_thread.setDaemon(True)
        # 启动子线程
        sub_thread.start()


    # tcp服务端套接字可以不需要关闭,因为服务端程序需要一直运行
    # tcp_server_socket.close()
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页