ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python网络编程之sockerserver 模块

2022-04-10 02:31:27  阅读:181  来源: 互联网

标签:sk socket socketserver AF python 编程 TCP sockerserver 接字


模块 socketserver

网络协议的最底层就是socket,基于原有socket模块,又封装了一层,就是socketserver
socketserver 为了实现tcp协议,server端的并发.

 

socket参数的详解

socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
创建socket对象的参数说明如下:

family地址系列应为AF_INET(默认值), AF_INET => ipv4 AF_INET6, => ipv6 AF_UNIX,AF_CAN或AF_RDS.(AF_UNIX 域实际上是使用本地 socket [文件]来通信)同一机器
type 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。  SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
proto 协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。
fileno 如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。 与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。 这可能有助于使用socket.close()关闭一个独立的插座。

 

客户端

import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9000)  )

# 处理收发数据逻辑

sk.close()

服务端

"""socketserver的提出 , 是为了允许在tcp协议下进行并发操作 ... """
import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        print("handle这个方法被触发了 .... ")

# ThreadingTCPServer( ip端口号 , 自定义的类 )
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000) , MyServer )
# 调用内部相关函数 
server.serve_forever()

 

 

用类定义

客户端

import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9001)  )


# 处理收发数据逻辑
while True:
    sk.send(b'give me five')
    res = sk.recv(1024)
    print(res.decode())

sk.close()

服务端

"""socketserver的提出 , 是为了允许在tcp协议下进行并发操作 ... """
import socketserver

class MyServer(socketserver.BaseRequestHandler):

    # 第五步: 处理收发数据的逻辑写在handle中;
    def handle(self):
        """
        <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9001), raddr=('127.0.0.1', 33778)>
        ('127.0.0.1', 33778)
        handle这个方法被触发了 .... 
        
        print(self.request)        # self.request <=> conn
        print(self.client_address) # self.client_address <=> addr
        print("handle这个方法被触发了 .... ")
        """
        conn = self.request
        while True:
            res = conn.recv(1024)
            res2 = res.decode()
            print(res2)
            conn.send(  res2.upper().encode()  )

# ThreadingTCPServer( ip端口号 , 自定义的类 )
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9001) , MyServer )
# 调用内部相关函数 
server.serve_forever()

 

socket的更多方法介绍

服务端套接字函数
s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
(等价于:异常处理+connect 一旦网络不通,作用:返回错误号而不是直接报错)

公共用途的套接字函数
s.recv()            接收TCP数据
s.send()       发送TCP数据,send返回值是发送的[字节数量],这个值可能小于要发送的string字节数
s.sendall()    发送TCP数据,sendall返回值是None,发送string所有数据
'''
# 下面两个代码等价:
    #sendall => sock.sendall('Hello world\n')
    #send => buffer = 'Hello world\n'
             while buffer:
                n = sock.send(buffer)
                buffer = buffer[n:] (切片)
'''
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()        创建一个与该套接字相关的文件

更多方法

 

标签:sk,socket,socketserver,AF,python,编程,TCP,sockerserver,接字
来源: https://www.cnblogs.com/shuaiyao666/p/16124588.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有