• python scoket


    一、简介

    scoket(套结字)在python就是模块

    二、分类

    基于文件型(不用)

    基于网络型

    名字:AF_INET

      AF_INET6

    三、scoket应用

    1、基于tcp

    长连接:基于tcp的Server端只能和一台Client端进行数据传输

    特点

      必须先运行Server端,再运行Client端

      在Server端,第一次可以接收或发送信息  

    # server端,基于tcp协议
    import socket
    sk = socket.socket()
    sk.bind(('127.0.0.1', 8010))
    sk.listen()
    connect, addr = sk.accept()
    ret = connect.recv(1024).decode('utf-8')
    print(ret)
    connect.send(bytes('hello', encoding='utf-8'))
    connect.close()
    sk.close()
    # client端,基于tcp协议
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1', 8010))
    sk.send(bytes('你好', encoding='utf-8'))
    ret = sk.recv(1024).decode('utf-8')
    print(ret)
    sk.close()
    # server端,基于tcp协议
    """
    优化,实现简单的对话功能
    """
    import socket
    sk = socket.socket()
    sk.bind(('127.0.0.1', 8010))
    sk.listen()
    connect, addr = sk.accept()
    while 1:
        ret = connect.recv(1024).decode('utf-8')
        print(ret)
        if ret == 'byte':
            break
        info = input('server>>>')
        connect.send(bytes(info, encoding='utf-8'))
    connect.close()
    sk.close()
    # client端,基于tcp协议
    """
    优化,实现简单的对话功能
    """
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1', 8010))
    while 1:
        info = input('client>>>')
        sk.send(bytes(info, encoding='utf-8'))
        if info == 'byte':
            break
        ret = sk.recv(1024).decode('utf-8')
        print(ret)
    
    sk.close()

    注意:

    1)sk.accept()和sk.connect(),里面是tuple

    2)在bind前加

    sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

     3)网络传输用bytes类型

    4)客户端和服务器的send和recv是相互关联的

    2、基于udp协议

    基于udp协议,不需要监听和连接,发送和接收都有两个参数(信息,地址)

    特点:

      Server端和Client端运行的顺序没有先后

      在Server端,第一次只能接收信息

    """
    基于udp协议
    Server端
    聊天系统
    """
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1', 8010))
    while 1:
        msg, addr = sk.recvfrom(1024)
        new_msg = msg.decode('utf-8')
        print(new_msg)
        # if new_msg == 'byte':
        #     break
        info = input('Server>>>')
        sk.sendto(info.encode('utf-8'), addr)
        if info == 'byte':
            break
    sk.close()
    """
    基于udp协议
    Client端
    """
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1', 8010)
    while 1:
        info = input('Client1>>>')
        new_info = ('来自Client的消息:' + info).encode('utf-8')
        sk.sendto(new_info, ip_port)
        if info == 'byte':
            break
        msg, addr = sk.recvfrom(1024)
        new_msg = msg.decode('utf-8')
        print(new_msg)
        if new_msg == 'byte':
            break
    sk.close()
    """
    基于udp协议
    Client2端
    """
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1', 8010)
    while 1:
        info = input('Clinet2>>>')
        new_info = ('来自Client2的消息:' + info).encode('utf-8')
        sk.sendto(new_info, ip_port)
        if info == 'byte':
            break
        msg, addr = sk.recvfrom(1024)
        new_msg = msg.decode('utf-8')
        print(new_msg)
        if new_msg == 'byte':
            break
    sk.close()

    注意:

      发送和接收数据,有两个参数(数据,地址)

      Server端不需要监听和连接,Client端不需要连接

      网络传输的数据类型是bytes,注意字符编码

      Server端第一次只能接收信息

  • 相关阅读:
    图解Eclipse中配置Maven并创建Maven的Web工程
    Bzoj1922: [Sdoi2010]大陆争霸
    Bzoj2007: [Noi2010]海拔
    Bzoj5212: [Zjoi2018]历史
    NOIP2017:列队
    NOIP2017:逛公园
    CF908D New Year and Arbitrary Arrangement
    HDU4652:Dice
    HDU4336:Card Collector(min-max容斥)
    [NOI2017]游戏
  • 原文地址:https://www.cnblogs.com/wt7018/p/10970605.html
Copyright © 2020-2023  润新知