TCP客户端与服务端

简介

socket(简称:套接字)是进程之间通信的一个工具,好比现实中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个socket,负责进程之间的网络数据传输,好比数据的搬运工

TCP客户端与服务端_第1张图片


一、TCP客户端开发

import socket

# 1.创建客户端套接字对象
# 参数1:ipv4(ip协议的版本)
# 参数2:选择协议(SOCK_STREAM==>TCP协议)
tcp_client_socket = socket.socket(socket.AF_INEF, socket.SCOK_STREAM)

# 2.和服务端套接字建立连接
# 参数:元组(有两个元素!)
# 参数1:服务器的ip地址(字符串)
# 参数2:服务器的端口号(数字)
tcp_client_socket.connect(("127.0.0.1", 8080))

# 发送数据的时候需要先转换成二进制
data = '123'
# 编码
data = data.encode("utf8")

# 3.发送数据
tcp_client_socket.send(data)

# 4.接受数据
# 参数:以字节为单位的接受的数据的大小
recv_data = tcp_client_socket.recv(1024)

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

二、服务端开发

import socket

# 1.创建服务端的套接字对象
# 参数1:ipv4
# 参数2:tcp协议
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.绑定端口号
# 参数:元组(两个元素) 参数1:ip地址(字符串) 参数2:端口号(数字)
# 参数1不写就是默认本地IP地址(127.0.0.1)
tcp_server_socket.bind(("参数1", 8080))

# 3.设置监听
# 参数:最大监听个数(排队等待处理的最大个数)
tcp_server_socket.listen(128)

# 4.阻塞等待接受客户端的连接请求
# 返回值是一个元组(有两个元素)
# 元素1:和客户端进行通信的socket 元素2:客户端的地址信息(ip,端口号)
# 通过拆包语法 我们分别获取两个元素(client_socket负责处理客户请求)
client_socket, client_addr = tcp_server_socket.accept()

# 5.接受数据
# 参数:接受数据的大小(字节)
client_data = client_socket.recv(1024)
# 对二进制的数据解码
client_data = client_data.decode()
print(client_data)

# 6.发送数据
send_data = "123".encode()
client_socket.send(send_data)

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

三、端口复用

# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 在创建服务端后面设置端口复用
# 端口复用(一旦服务端关闭,端口马上释放)
# setsocketopt: 设置socket选项
# 参数1:socket选项列表(SOL)
# 参数2:地址复用
# 参数3:True:开启选项(默认都是不开启)
tcp_server_socket.setsocketopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

四、持续接受数据,判断客户端关闭

   (对中间的部分代码进行改变) 

while True:
    # 5.服务端接受数据
    client_data = client_socket.recv(1024)
    
    # 如果接受的数据长度为零,则证明客户端关闭
    if len(client_data) == 0:
        print("客户端关闭!")
        break
        
    # 对二进制的数据解码
    client_data = client_data.encode()
    print(client_data)
    # 6.发送数据
    send_data = "123".encode()
    client_data.send(send_data)

五、服务端的多任务

import socket
import multiprocessing


def handler_client_request(client_socket):
    """ 处理客户端请求 """
    while True:
        # 接受数据
        client_data = client_socket.recv(1024)
    
        # 如果接受的数据长度为零,则证明客户端关闭
        if len(client_data) == 0:
            print("客户端关闭!")
            break
    
        # 对二进制的数据解码
        client_data = client_data.encode()
        print(client_data)
        # 发送数据
        send_data = "123".encode()
        client_data.send(send_data)


def main():
    # 1.创建服务端的套接字对象
    # 参数1:ipv4
    # 参数2:tcp协议
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2.绑定端口号
    # 参数:元组(两个元素) 参数1:ip地址(字符串) 参数2:端口号(数字)
    # 参数1不写就是默认本地IP地址(127.0.0.1)
    tcp_server_socket.bind(("参数1", 8080))
    
    # 3.设置监听
    # 参数:最大监听个数(排队等待处理的最大个数)
    tcp_server_socket.listen(128)
    
    while True:
        # 4.阻塞等待接受客户端的连接请求
        # 返回值是一个元组(有两个元素)(元素1:和客户端进行通信的socket 元素2:客户端的地址信息(ip,端口号)
        # 通过拆包语法 我们分别获取两个元素(client_socket负责处理客户请求)
        client_socket, client_addr = tcp_server_socket.accept()
        
        # 创建子进程
        sub_process = multiprocessing.Process(target=handler_client_request, args=(client_socket,))
        # 开启子进程
        sub_process.start()

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


if __name__ == '__main__':
    

六、原理解析图

TCP客户端与服务端_第2张图片


你可能感兴趣的:(笔记,网络)