zoukankan      html  css  js  c++  java
  • python socket知识点

    ---恢复内容开始---

      数据在网络上进行传播,需要通过一种通信协议。常见的通信协议有:HTTP,SMTP,DNS,FTP,SSH,SNMP,ICMP PING,DNCP.

      OSI(Open System Interconnect)七层协议:(

      

      在python中如何实现数据的传播呢?答案就是socket,Python将TCP/IP和UDP一起封装在了socket中。

      在socekt实例中有两个很重要的参数 1 地址簇 2 协议类型。这两个参数将直接影响到通信的建立。

    FAMILY ADDRESS
    AF.INET ==> IPv4,
    AF.INET6 ==> IPv6
    AF.UNIX ==> local (不常用)
    PROTOCOL TYPE
    SOCK_STREAM ==> TCP/IP协议
    SOCK_DGRAM ==> UDP
    默认的实例建立为AF.INET,sock.SOCK_STREAM

      首先建立两个端:服务器端(server)和客户端(client)。

      先来看两个最简单的例子:

      客户端:

    #客户端
    
    import socket#引入socket方法
    client = socket.socket()#声明socket的类型,同时生成socket的连接对象
    client.connect(('localhost',6969))#连接的端口号和端口名
    client.send(b"Im client")#需要发送的数据
    data = client.recv(1024)#默认最大接收的字节数
    print('recv:',data)#打印接收到的数据
    client.close()#关闭客户端
    

      服务器端:

    import socket
    server = socket.socket()
    server.bind(('localhost',6969))#绑定需要监听的端口
    server.listen()#开始监听,括号内可设置最大的可监听数量
    print('Im starting listening')
    conn,addr = server.accept()#等活动开始,accept 将返回两个值,分别送到conn和addr中,conn就是客户端对应在服务器端的连接实例
    print("listened")
    data = conn.recv(1024)#赋值变量储存接接收客户端的数据,最大为1024byte
    print('recv:',data)
    conn.send(data.upper())#将从客户端收来的数据大写
    
    server.close()
    

      那么现在实现了一对一的单次交互,如果想实现一对一的多次交互呢?

      使用while True循环:

      客户端:

    while True:
        msg = input('>>:'.strip())
        client.send(msg.encode('utf-8'))#需要发送的数据
        data = client.recv(1024)#默认最大接收的字节数
        print('recv:',data)#打印接收到的数据
    

      服务器端:

    while True:
        print("listened")
        data = conn.recv(1024)
        print('recv:',data)
        conn.send(data.upper())
    

      由以上可以看出不管是客户端还是服务器端均是将循环建立在已经确立连接端口之后,即不会重新建立新连接,使用同一端口进行循环通信,这是一对一同一对象进行循环交互的方法。

      如果想要实现两个甚至多个客户端与服务器端进行交互怎么办呢?类似打电话,现在已经建立了连接,当有第二个客户打入的时候会提示说占线请等待。那么在python中应该如何实现呢?

      同样也是while循环。

    while True:
        conn,addr = server.accept()#等活动开始,conn就是客户端对应在服务器端的连接实例
    

      此次循环加在接收端口号和地址的前面,表示每被客户端挂断一次便进行一次循环再次与第二个客户端建立通信,达到与多个客户端通信的需求。

  • 相关阅读:
    .ascx和.ashx文件说明
    零基础学习JavaScript(1)1.2JavaScript功能简介
    零基础学习JavaScript(1)1.1什么是JavaScript
    小实验3:实现haproxy的增、删、查
    小实验2:三级菜单
    python enumerate
    小实验1:购物车记录
    对西部数据硬盘自带的加密进行修改密码和取消密码保护
    CloudFoundry忘记密码?
    获取网页上没有下载链接的视频音频资源
  • 原文地址:https://www.cnblogs.com/BigJ/p/7424679.html
Copyright © 2011-2022 走看看