目录

1. python3编码转换

2. TCP网络应用程序开发

2.1 概述

2.2 开发流程

 2.3 TCP客户端程序开发

2.4 TCP服务端程序开发

2.5 注意点

3. socket之send和recv原理

4. 案例


1. python3编码转换

1.网络传输是以二进制数据进行传输的。

2.数据转化用到了encode和decode函数:

  • str.encode(encoding="utf-8")
  • bytes.decode(encoding="utf-8")

2. TCP网络应用程序开发

2.1 概述

1.TCP网络应用程序开发分为客户端程序开发和服务端程序开发。

2.主动发起建立连接请求的是客户端程序。

3.等待接受连接请求的是服务端程序。

2.2 开发流程

 2.3 TCP客户端程序开发

1.创建客户端套接字对象(买电话)

2.和服务端套接字建立连接(打电话)

3.发送数据(说话)

4.接收数据(接听)

5.关闭客户端套接字(挂电话)

import socket

if __name__ == '__main__':
    # 1.创建客户端套接字对象(AF_INET表示IP地址类型是IPv4,SOCK_STREAM表示传输协议类型是TCP)
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

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

    # 3.发送数据
    tcp_client_socket.send("nihaoma".encode(encoding="utf-8"))

    # 4.接受数据(recv阻塞等待数据的到来)
    recv_data = tcp_client_socket.recv(1024)
    # decode函数的字符集默认是utf-8
    print("客户端接收到的数据:",recv_data.decode())

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

客户端发送:

nihaoma

服务端接收:

服务端发送:

客户端接收:

2.4 TCP服务端程序开发

1.创建服务端套接字对象

2.绑定IP地址和端口号

3.设置监听

4.等待接受客户端的连接请求

5.接收数据

6.发送数据

7.关闭套接字

import socket

if __name__ == '__main__':
    # 1.创建服务端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用(程序退出时,端口号立即释放)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2.绑定IP地址和端口号
    # tcp_server_socket.bind(("192.168.43.163",8888))
    # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
    tcp_server_socket.bind(("", 8888))

    # 3.设置监听(128代表服务端等待排队连接的最大数量)
    tcp_server_socket.listen(128)

    # 4.等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
    conn_socket, ip_port = tcp_server_socket.accept()
    print("客户端地址:", ip_port)

    # 5.接收数据
    recv_data = conn_socket.recv(1024)
    print("服务端接收到的数据:",recv_data.decode())

    # 6.发送数据
    conn_socket.send("nihao".encode())

    # 7.关闭套接字
    conn_socket.close()
    tcp_server_socket.close()

客户端发送:

服务端接收:

服务端发送:

nihao

客户端接收:

 

2.5 注意点

3. socket之send和recv原理

不管是recv还是send都不是直接接收到对方的数据和发送数据到对方。

发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取。

发送数据和接收数据最终是由操作系统控制网卡来完成。

4. 案例

开发一个多任务版TCP服务端程序,实现一个服务端同时服务多个客户端。

分析:多个需要用到循环,同时需要用到多线程。

import socket
import threading

def handle_client(conn_socket):
    # 3.5接收数据
    recv_data = conn_socket.recv(1024)
    print("服务端接收到的数据:", recv_data.decode())

    # 3.6发送数据
    conn_socket.send("nihao".encode())

    # 3.7关闭与客户端通信的套接字
    conn_socket.close()

if __name__ == '__main__':
    # 1.创建服务端套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2.绑定IP地址和端口号
    # tcp_server_socket.bind(("192.168.43.163",8888))
    # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
    tcp_server_socket.bind(("", 8888))

    # 3.循环接收客户端的连接请求
    while True:
        # 3.1设置监听(128代表服务端等待排队连接的最大数量)
        tcp_server_socket.listen(128)

        # 3.2等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
        conn_socket, ip_port = tcp_server_socket.accept()
        print("客户端地址:", ip_port)

        # 3.3创建多线程用来同时接收多个客户端的请求
        sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))

        # 3.4启动线程执行任务
        sub_thread.start()

    # 4.关闭服务端套接字
    tcp_server_socket.close()

服务端:

客户端1:

客户端2:

 

更多推荐

Python之TCP网络编程