python中的socket套接字模块


前言

关于python中的socket套接字模块实现tcp循环为多个客户端服务


一、套接字是什么?

套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。Socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数
据,以符合指定的协议。

二、分类

1、tcp套接字(SOCK_STREAM):以字节流方式传输数据,实现tcp网络传输方案。(面向连接–tcp协议–可靠的–流式套接字)
2、udp套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。(无连接–udp协议–不可靠–数据报套接字)
服务端:提供服务的一端
客户端:请求服务的一端
在互联网中处处是C/S架构

示例代码如下(udp):

# coding = 'utf-8'
# _author_ = 'ych'
# _file_ = 'udp聊天器.py'
# _date_ = '2022/3/27 11:54'
import socket
'''
套接字是全双工的
'''

def send_msg(udp_socket):
    # 获取对方ip和port
    target_ip = input('enter target ip:')
    target_port = int(input('enter target port:'))

    # 从键盘获取数据
    send_data = input('enter data:')
    udp_socket.sendto(send_data.encode("gbk"), (target_ip, target_port))


def recv_msg(udp_socket):
    # 接收传回来的数据
    recv_data = udp_socket.recvfrom(1024)
    # 套接字可以同时收发数据
    print("%s:%s" % (str(recv_data[1]), recv_data[0].decode('gbk')))


def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定信息
    udp_socket.bind(("", 7788))
    while True:
        print("-----------------------udp聊天器---------------------------")
        print("发送消息---1")
        print("接收消息---2")
        print("退出---0")
        flag = input('输入功能:')
        if flag == "1":
            # 发送
            send_msg(udp_socket)
        elif flag == "2":
            # 接收并显示
            recv_msg(udp_socket)
        elif flag == "0":
            break
        else:
            print("输入错误!")


if __name__ == "__main__":
    main()

运行结果如下:
python中的socket套接字模块_第1张图片
网络调试助手收到数据如下:
选择协议类型为udp,设置ip和port即可连接。
python中的socket套接字模块_第2张图片

示例代码如下(tcp):

# coding = 'utf-8'
# _author_ = 'ych'
# _file_ = 'tcp循环为多个客户端服务.py'
# _date_ = '2022/4/4 20:11'
import socket


def main():
    # 1、买个手机(创建套接字 socket)
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2、插入手机卡(绑定本地信息 bind)
    tcp_server_socket.bind(("", 1999))

    # 3、将手机设置成响铃模式(让默认的套接字由主动变为被动 listen)
    tcp_server_socket.listen(128)

    # 循环:多次调用accept,实现为多个客户端服务
    while True:
        print("等待一个新的客户端连接......")
        # 4、等待别人的电话打进来(等待客户端连接 accept)
        new_client_socket, client_addr = tcp_server_socket.accept()
        print("一个新的客户端连接到来%s" % str(client_addr))

        # 循环:为同一个客户端提供多次服务
        while True:
            # 接收客户端的数据
            recv_data = new_client_socket.recv(1024)
            print("%s客户端发送的数据为:%s" % (str(client_addr) ,recv_data.decode('gbk')))

            # 如果recv解堵塞了,分两种情况  1、客户端发送了数据  2、客户端调用了close
            if recv_data:    # 如果有数据
                # 服务器返回响应给客户端
                new_client_socket.send("----------ok----------".encode('gbk'))
            else:
                break
        # 关闭套接字   关闭accept返回的套接字则不再为该客户端服务
        new_client_socket.close()
        print("%s客户端服务完毕......" % str(client_addr))

    # 关闭监听的套接字  不再提供服务
    tcp_server_socket.close()


if __name__ == "__main__":
    main()

运行结果如下:
python中的socket套接字模块_第3张图片
网络调试助手设置为tcp客户端,绑定代码中的端口号1999即可连接。同时服务端成功接收到客户端发的数据会返回一个ok作为响应。
python中的socket套接字模块_第4张图片

你可能感兴趣的:(python)