zoukankan      html  css  js  c++  java
  • socket(套接字)

    socket(套接字)

    socket简称(套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

    它能实现不同主机间的进程通信,我们网络上各种服务大多都是基于socket完成通信的

    网页,微信,email

    socket()模块函数用法
    1 import socket
     2 socket.socket(socket_family,socket_type,protocal=0)
     3 socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。
     4 
     5 获取tcp/ip套接字
     6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     7 
     8 获取udp/ip套接字
     9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    10 
    11 由于 socket 模块中有太多的属性。我们在这,,里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
    12 例如tcpSock = socket(AF_INET, SOCK_STREAM)
    
    服务端套接字函数
    s.bind()  绑定(主机,端口号)到套接字
    
    s.listen()  开始TCP监听
    
    s.accept() 被动接受TCP客户的连接,阻塞式等待连接的到来
    
    客户端套接字函数
    s.connect()  主动初始化TCP服务器连接
    
    s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
    
    公共用途的套接字函数
    s.recv() 接受TCP数据
    
    s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    
    s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    
    s.recvfrom() 接受UDP数据
    
    s.sendto() 发送UDP数据
    
    s.getpeername() 连接到当前套接字的远端地址
    
    s.getsockname() 当前套接字地址
    
    s.getsockopt() 返回指定套接字的参数
    
    s.setsockopt() 设置指定套接字的参数
    
    s.close() 关闭套接字
    
    面向锁的套接字方法
    s.setblocking()     设置套接字的阻塞与非阻塞模式
    s.settimeout()      设置阻塞套接字操作的超时时间
    s.gettimeout()      得到阻塞套接字操作的超时时间
    
    面向文件的套接字函数
    s.fileno()          套接字的文件描述符
    s.makefile()        创建一个与该套接字相关的文件
    
    基于TCP套接字

    server

    import socket
    
    # 1、买手机
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议
    
    # 2、插手机卡
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
    
    phone.bind(("127.0.0.1", 8080))  # 本地回环
    
    # 3、开机
    phone.listen(5)
    print('starting %s:%s' %("127.0.0.1", 8080))
    
    # 4、等电话链接=>链接循环
    while True:
        conn, client_addr = phone.accept()
        print(client_addr)
        # 5、收/发消息=>通信循环
        while True:
            try:
                data = conn.recv(1024)  # 最大接收的字节个数
                if len(data) == 0:  # 针对linux系统
                    break
                print("收到的客户端数据:", data.decode('utf-8'))
                conn.send(data.upper())
            except Exception:  # 针对windows系统
                break
    
        # 6、关闭
        conn.close()  # 挂电话
    phone.close()  # 关机
    

    client

    import socket
    
    # 1、买手机
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM=》TCP协议
    
    # 2、拨电话
    phone.connect(("127.0.0.1", 8080))
    
    # 3、发/收消息=>通信循环
    while True:
        msg = input(">>: ").strip()
        phone.send(msg.encode('utf-8'))
        data = phone.recv(1024)
        print("服务的返回的数据:", data.decode('utf-8'))
    
    # 4、关闭
    phone.close()
    
  • 相关阅读:
    常用颜色代码 (30种)
    C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
    如何: 通过HTML文档对象模型访问文档中的ActiveX控件的属性 .
    理解预编译头
    #ifndef用法总结 .
    C++中MessageBox()的详细用法
    如何用Javascript捕获ActiveX对象的事件
    ActiveX控件调用JavaScript函数的方法
    MFC Activex与JavaScript的接口交互
    include包含文件查找的顺序 .
  • 原文地址:https://www.cnblogs.com/lgh8023/p/13500146.html
Copyright © 2011-2022 走看看