• python-socket编程


    socket针对tcp编程,

    用于客户端和服务端之间的数据交互。

    1、基本代码框架如下:

    特点:

    1)双向通信功能:服务端、客户端都可以发送和接收数据

    2)accept和recv是阻塞的

    2、一个客户端通信的代码

    1)服务端

    '''
    总结:
    1、服务端要先启动,不然客户端启动后,找不到服务端的地址,会报错。
    2、服务端启动后,阻塞到accept,等待有客户端连接。当有客户端连接以后,会阻塞到recv,直到收到客户端的消息。
    3、accept和recv方法会阻塞,直到客户端或服务端执行了某操作,形成你来我往的通信。
    4、发送数据需要将数据编码(encode)成bytes类型,接收到的数据需要解码
    '''
    
    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.55', 8083))  # 绑定服务器地址 + 端口
    server.listen()  # 监听
    
    sk, addr = server.accept()  # 服务器与客户端建立连接。阻塞的,如果没有建立连接,就一直等待在这儿。如果想一个服务器与多个客户端建立连接,需要使用多线程。
    print('客户0连接成功')
    while True:  # 通过循环,取大于1024的数据,即:将大于1024的数据接收完成
        '''实现双向通信'''
        sk.send('Welcome to server!'.encode('utf8'))  # 连接成功后服务器向客户端发送信息,利用accept到的sk
        temp_data = sk.recv(1024)  # recv方法是阻塞的。1024是默认的,表示一次接收的最大数据长度,可以省略。可以设置为其他值,最大值根据操作系统的不同,由TCP协议定。
        print(temp_data.decode('utf8'))  # 将接收的bytes数据解码成string类型
        # input_data = input()
        input_data = '服务器向客户端传输的数据'
        sk.send(input_data.encode('utf8'))  # 发送数据需要将数据编码成bytes类型
    sk.close()  # 关闭连接

    2)客户端

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.55', 8083))  # 连接服务器,连接成功以后,客户端会阻塞到recv
    server_data = client.recv(1024)  # 等待客户端发送消息
    print(f'Server response: {server_data.decode("utf8")}')
    
    while True:
        # input_data = input('请输入要想服务器传输的数据:')
        input_data = '客户端0第一次传输的数据'
        client.send(input_data.encode('utf8'))
        server_data = client.recv(1024)
        print(f'Server response: {server_data.decode("utf8")}')
        break  # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。

    3、多个客户端通信代码

     1)服务端

    import socket
    import threading
    
    
    def client_sev(client_name, sk, addr):
        print(f'{client_name}连接成功')
        while True:  # 通过循环,取大于1024的数据,即:将大于1024的数据接收完成
            '''实现双向通信'''
            sk.send('Welcome to server!'.encode('utf8'))  # 连接成功后服务器向客户端发送信息,利用accept到的sk
            temp_data = sk.recv(1024)  # recv方法是阻塞的。1024是默认的,表示一次接收的最大数据长度,可以省略。可以设置为其他值,最大值根据操作系统的不同,由TCP协议定。
            print(temp_data.decode('utf8'))  # 将接收的bytes数据解码成string类型
            # input_data = input()
            input_data = f'服务器向{client_name}传输的数据'
            sk.send(input_data.encode('utf8'))  # 发送数据需要将数据编码成bytes类型
        sk.close()  # 关闭连接
    
    
    server = socket.socket()
    server.bind(('127.0.0.55', 8083))  # 绑定服务器地址 + 端口
    server.listen()  # 监听
    while True:
        sk, addr = server.accept()  # 使用多线程,服务端与多个客户端可以同时连接
        client_name = sk.recv(1024).decode('utf8')
        client_thread = threading.Thread(target=client_sev, args=(client_name, sk, addr, ))  # 建立多线程对象
        client_thread.start()  # 启动多线程
        # client_sev(client_name, sk)

    2)客户端1

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.55', 8083))  # 连接服务器,连接成功以后,客户端会阻塞到recv
    client.send('客户0'.encode('utf8'))
    server_data = client.recv(1024)  # 等待客户端发送消息
    print(f'Server response: {server_data.decode("utf8")}')
    
    while True:
        # input_data = input('请输入要想服务器传输的数据:')
        input_data = '客户0第一次传输的数据'
        client.send(input_data.encode('utf8'))
        server_data = client.recv(1024)
        print(f'Server response: {server_data.decode("utf8")}')
        break  # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。

    3)客户端2...

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.55', 8083))  # 连接服务器,连接成功以后,客户端会阻塞到recv
    client.send('客户1'.encode('utf8'))
    server_data = client.recv(1024)  # 等待客户端发送消息
    print(f'Server response: {server_data.decode("utf8")}')
    
    while True:
        # input_data = input('请输入要想服务器传输的数据:')
        input_data = '客户1第一次传输的数据'
        client.send(input_data.encode('utf8'))
        server_data = client.recv(1024)
        print(f'Server response: {server_data.decode("utf8")}')
        break  # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。
  • 相关阅读:
    【算法笔记】多线程斐波那契数列
    RAID技术详解
    Mysql 语句汇总(性能篇)
    JS 网页打印解决方案
    MyEclipse修改
    几个需要学习的点和技术
    MyEclipse配色字体等配置的解决方案
    使用hibernate 分表做增删改查
    Web平台开发流程以及规范
    easyui使用总结
  • 原文地址:https://www.cnblogs.com/jaysonteng/p/12729330.html
Copyright © 2020-2023  润新知