zoukankan      html  css  js  c++  java
  • socket更多方法

    一.socket的更多方法介绍

    ###socket更多方法

    服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 客户端套接字函数 s.connect() 主动初始化TCP服务器连接 s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 s.recv() 接收TCP数据 s.send() 发送TCP数据 s.sendall() 发送TCP数据 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() 创建一个与该套接字相关的文件
    ###send和sendall方法

    官方文档对socket模块下的socket.send()和socket.sendall()解释如下: socket.send(string[, flags]) Send data to the socket. The socket must be connected to a remote socket. The optional flags argument has the
    same meaning as
    for recv() above. Returns the number of bytes sent. Applications are responsible for checking
    that all data has been sent; if only some of the data was transmitted, the application needs to attempt
    delivery of the remaining data. send()的返回值是发送的字节数量,这个数量值可能小于要发送的string的字节数,也就是说可能无法发送string中所有的数据。
    如果有错误则会抛出异常。 – socket.sendall(string[, flags]) Send data to the socket. The socket must be connected to a remote socket. The optional flags
    argument has the same meaning as
    for recv() above. Unlike send(), this method continues to
    send data from string until either all data has been sent or an error occurs. None is returned
    on success. On error, an exception is raised, and there is no way to determine how much data,
    if any, was successfully sent. 尝试发送string的所有数据,成功则返回None,失败则抛出异常。 故,下面两段代码是等价的: #sock.sendall('Hello world ') #buffer = 'Hello world ' #while buffer: # bytes = sock.send(buffer) # buffer = buffer[bytes:]

    二.验证客户端链接的合法性

    ###server
    
    import os import socket import hmac secret_key = '老衲洗头用飘柔'.encode('utf-8') sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() while True: try: conn,addr = sk.accept() random_bytes = os.urandom(32) conn.send(random_bytes) obj = hmac.new(key =secret_key,msg =random_bytes) ret = obj.hexdigest() msg = conn.recv(1024).decode('utf-8') if msg == ret:print('是合法的客户端') else:conn.close() finally: sk.close() break
    ###client

    import
    socket import hmac secret_key = '老衲洗头用飘柔'.encode('utf-8') sk = socket.socket() sk.connect(('127.0.0.1',9000)) urandom = sk.recv(1024) hmac_obj = hmac.new(key = secret_key,msg =urandom) sk.send(hmac_obj.hexdigest().encode('utf-8')) sk.close()
    ###hmac加密

    import
    hmac obj = hmac.new(key = b'secret_key',msg =b'11010012922') print(obj.hexdigest()) key是盐,msg是需要加密的东西,key和msg都是bytes类型

    三.socketserver

    ###server

    import
    socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): while True: print(self.request.recv(1024)) #self.request = conn self.request.send(b'hello') if __name__ == '__main__': socketserver.TCPServer.allow_reuse_address = True server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),MyServer) server.serve_forever()
    ###client

    import
    socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) while True: sk.send(b'haha') print(sk.recv(1024)) sk.close()
  • 相关阅读:
    .net中的委托
    GridView, DataList and ListBox 行 单击与双击事件处理
    ChineseCalendar类[转]
    数据契约(DataContract)
    XPath 语法(复习)
    正则表达式学习笔记
    瑞星笔试:现场上机做题[转]
    发送带有附件的电子邮件使用 Cdosys.dll 库
    DataContractJsonSerializer 类 操作json类型数据
    i guess a bug on Castle
  • 原文地址:https://www.cnblogs.com/molieren/p/9368408.html
Copyright © 2011-2022 走看看