zoukankan      html  css  js  c++  java
  • 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端第一次只能接收信息

  • 相关阅读:
    hibernate和ibatis的区别
    [转] hibernate和ibatis的对比
    如何理解java的引用传递
    代理模式与装饰器模式的区别
    j2ee的异步消息机制
    什么是j2ee ??EJB与j2ee的关系?? 请看百度百科
    spring事务的传播性的理解
    Hibernate与IBatis的优缺点及可行性分析
    jQuery插件实现的方法和原理简单说明
    iReport使用教程
  • 原文地址:https://www.cnblogs.com/wt7018/p/10970605.html
Copyright © 2011-2022 走看看