学习目标day04(网络编程-http协议)

1.能够说出IP地址的作用

IP 地址就是标识网络中设备(电脑)的一个地址
P 地址的作用是唯一标识网络中的一台设备(电脑)

2.能够说出端口和端口号的作用

端口是传输数据的通道,是网络程序对外传输数据的出入口
操作系统为了统一管理这么多端口,就对端口进行了编号

3.能够说出TCP的特点

1. 面向连接
   - 先连接再通信,数据传输完成后,断开连接,以释放系统资源。
2. 可靠传输: 
   - TCP 采用发送应答机制
   - 超时重传
   - 错误校验
   - 流量控制和阻塞管理

4.能够说出socket的作用

socket (简称 套接字) 是进程之间通信一个工具,进程间通信的一种实现方式,主要用于不同主机的进程通信

5.能够知道TCP客户端程序的开发流程

"""TCP客户端实现
实现步骤:
1. 创建一个tcp的socket对象
2. 与tcp服务端建立连接
3. 数据通信(收发数据)
4. 关闭socket,释放连接
"""
import socket


def main():
    # 1. 创建一个tcp的socket对象
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 与tcp服务端建立连接
    # address:tcp服务端的地址  the address is a pair (host, port)

    server_addr = ('192.168.64.118', 8080)  # tcp服务端的地址
    tcp_client_socket.connect(server_addr)

    # 3. 数据通信(发收数据)
    # 3.1 发送数据到服务端
    send_data = input("请输入要发送的数据:")
    data = send_data.encode('utf-8')  # 编码  把字符串转为二进制串
    tcp_client_socket.send(data)

    # 3.2 等待接收服务端回传的消息,阻塞状态
    recv_data = tcp_client_socket.recv(1024)  # 一次最多接收1024字节

    # 显示接收到的数据
    # b'ni ye hao '
    print(recv_data.decode('gbk'))  # 解码,把二进制串解码为字符串
    # 4. 关闭socket,释放连接
    tcp_client_socket.close()


if __name__ == '__main__':
    main()

6.能够写出TCP客户端应用程序发送和接收消息

 send_data = input("请输入要发送的数据:")
    data = send_data.encode('utf-8')  # 编码  把字符串转为二进制串
    tcp_client_socket.send(data)

    # 3.2 等待接收服务端回传的消息,阻塞状态
    recv_data = tcp_client_socket.recv(1024)  # 一次最多接收1024字节

    # 显示接收到的数据
    # b'ni ye hao '
    print(recv_data.decode('gbk'))  # 解码,把二进制串解码为字符串

8.能够说出开发TCP网络应用程序的注意点

1. 当 TCP 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接
2. TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
3. TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
4. listen 后的套接字是被动套接字,只负责监听和接收新的客户端的连接请求,不能收发消息。
5. 当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
6. 关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
7. 关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
8. 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0

9.能够说出多任务版TCP服务端程序的实现过程

# 【完善二】 通过多线程实现多任务
t1 = threading.Thread(target=handle_client_request, args=(new_sock,))  # 方法抽取 ctrl+alt+method
t1.daemon = True  # 设置守护主线程, 当主线程代码执行完毕后,守护主线程也立即结束
t1.start()# 开启子线程

def handle_client_request(new_sock):
    """用于处理客户端的请求,即与客户端收发数据,通信用的"""
    # 5. 使用新创建的socket对象等待接收数据
    recv_data = new_sock.recv(1024)
    # 解码: 把二进制串转为字符串
    data = recv_data.decode('gbk')
    # 6.使用新创建的socket对象发送数据
    new_sock.send('欢迎光临'.encode('utf-8'))
    # 7 关闭与客户端通信的socket 不再与当前客户端通信
    new_sock.close()

10.能够知道send和recv的原理剖析
学习目标day04(网络编程-http协议)_第1张图片

你可能感兴趣的:(学习)