Python高级之Socket 探索(五)

目录:

  • 面向对象
  • 反射
  • socket

一、面向对象

方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
静态方法:由类调用;无默认参数;

class Aniaml:
    count = 10
    def __init__(self,name):
        self.name = name
        self.num = None
    hobbie = ‘meat‘
    @classmethod    #类方法,不能访问实例变量
    def talk(self):
        print(‘%s is talking ...‘%self.hobbie )
    @staticmethod   #静态方法,不能访问类变量及实例变量
    def walk():
        print(‘is walking ...‘)
    @property   #把方法变属性
    def habbit(self):
        print(‘%s habit is sss‘%self.name)
    @property
    def total_players(self):
        return self.num
    @total_players.setter
    def total_players(self,num):
        self.num = num
        print(‘total players:‘,self.num)
    @total_players.deleter
    def total_players(self):
        print(‘total player got deleted.‘)
        del self.num
Aniaml.hobbie
Aniaml.talk()

d = Aniaml(‘hahah‘)
print(d.total_players)
d.total_players = 3
类的特殊成员,内部模块

class A:
    n = ‘A‘
    def f2(self):
        print(‘f2 from A‘)
class B(A):

    n = ‘B‘
    def __init__(self):
        pass
    def f1(self):
        print(‘f1 from B‘)
    def f2(self):
        print(‘f2 from B‘)
    def __del__(self):
        print(‘del ....‘)
    def __call__(self, *args, **kwargs):
        print(‘__cal__‘)
class C(A):
    n = ‘C‘
    def f2(self):
        print(‘f2 from C‘)
class D(B,C):
    pass
d = D()
d.f1()
d.f2()
print(B.__doc__)
print(B.__dict__)
print(B.__class__)
print(B.__module__)
B.__del__
obj = B()
obj()

二、反射

Python中的反射功能由以下四个内置函数提供:

  • hasattr()    检查是否包含某成员
  • getattr()    获取成员
  • setattr()    设置成员
  • delattr()    删除成员

1、从前我们最开始在写一些输入选项的时候会使用简单的if … else..来实现:

 raw = input(‘输入您的选择:’).strip()
    if raw == ‘start’:
        pass
    else raw == ‘stop’:
        pass
    …

2、后来学习了字典以后,我们发现原来可以精简一些:

menu_dic = {‘1‘:‘start’,‘2‘:‘stop‘,‘3‘:‘restart‘}
    raw = input(‘请输入您的选择: ‘).strip()
    if raw in menu_dic:
      print(menu_dic[raw])

3、再后来学习了反射后,我们发现原来还可以再精简一些:

import sys
class WebServer(object):
    def __init__(self,host,port):
        self.host = host
        self.port = port
    def start(self):
        print(‘Server is stating ...‘)
    def stop(self):
        print(‘Server is stopping ...‘)
    def restart(self):
        self.stop()
        self.start()
        print(‘Server is restarting ...‘)
if __name__ == ‘__main__‘:
    server = WebServer(‘localhost‘,80)
    #hasatter 判断输入参数是否包含在class WebServer()
    if hasattr(server,sys.argv[1]):
    #如果包含,获取该成员
        func = getattr(server,sys.argv[1])
        func()
$ python3 day07.py start
Server is stating ...

如果要设置一个新的成员,则需要使用setattr(),删除的话则要使用delattr(),修改为:

def test_run(self,name):
     print(‘Test_running ...‘,name,self.host)
if __name__ == ‘__main__‘:
     server = WebServer(‘localhost‘,80)
if hasattr(server,sys.argv[1]):
    func = getattr(server,sys.argv[1])
     func()
setattr(server,‘run‘,test_run)
server.run(server,‘haha’)
#运行结果
Server is stating …
Test_running ... haha localhost

三、socket

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
    socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
    socket和file的区别:
file模块是针对某个指定文件进行【打开】【读写】【关闭】
socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

具体状态:

sk.bind(address)
    将套接字绑定到地址。adress地址的格式取决于地址族。以元组(host,port)的形式表示地址。
sk.listen(backlog)
    开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
    backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5.这个值不能无限大,因为内核中维护连接队列。
sk.setblock(bool)
    是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
sk.accept()
    接受连接并返回(conn,address)其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
    接收TCP客户的连接(阻塞式)等待连接的到来。
sk.connect(adress)
    连接到address处的套接字。address格式为元组。如果连接出错,返回socket.error错误。
sk.connect_ex(address)
    同上,区别是有返回值。连接成功返回0,失败则返回其他编码。
sk.close()
    关闭套接字
sk.recv(bufsize)
    接收套接字的数据。数据以字符串形式返回,bufsize可以指定最多可以接收的数量。
sk.send(string)
    将str中的数据发送到连接的套接字。返回值是要发送的字节数量。
sk.sendall(string)
    将str中的数据发送到连接的套接字,但在返回之前会尝试发送所有的数据。成功返回None,失败则抛出异常。
sk.sendto(string,address)
    将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是是发送的字节数。该函数主要用于UDP协议。
sk.settimeout(timeout)
    设置套接字操作的超时时间,最好在刚创建套接字时设置。
sk.getpeername()
    返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)
sk.getsockname()
    返回套接字自己的地址。
sk.fileno()
    套接字的文件描述符。

执行流程

server 端:
    1、创建套接字,绑定套接字到本地IP和端口

 ip_port = (‘127.0.0.1‘,9998)
 sk = socket.socket()
 sk.bind(ip_port)

2、开始监听
        sk.listen(5)
    3、进入循环,不断接受客户端的连接请求

while True:
        print(‘Server is waiting ... ‘)
        conn,addr = sk.accept()

4、然后接收传来的数据,并发送给对方数据

 client_data = conn.recv(1024)
 print(str(client_data,‘utf-8’))
 conn.sendall(bytes(‘这是 server !‘,‘utf-8’))

5、传输完毕,关闭套接字
    sk.close()
clinet端:
    1、创建套接字,绑定套接字到本地IP和端口

ip_port = (‘127.0.0.1‘,9998)
sk  = socket.socket()
sk.bind(ip_port)

2、连接后发送数据和接受数据
        sk.sendall()
        sk.recv()
    3、传输完毕后,关闭套接字()
        sk.close()

代码示例:实现client输入发送信息,server返回client输入的信息。

#server端
import socket
ip_port = (‘127.0.0.1‘,9998)
sk  = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    print(‘Server is waiting ... ‘)
    conn,addr = sk.accept()
    client_data = conn.recv(1024)
    print(str(client_data,‘utf-8‘))
    conn.sendall(bytes(‘这是 server !‘,‘utf-8‘))
    while True:
        client_data = conn.recv(1024)
        print(‘revv:‘,str(client_data,‘utf8‘))
        if not (client_data):break
        conn.sendall(client_data)
#client端
import socket
ip_port = (‘127.0.0.1‘,9998)

sk = socket.socket()
sk.connect(ip_port)

sk.sendall(bytes(‘这是 client !‘,‘utf-8‘))
server_replay = sk.recv(1024)
print(str(server_replay,‘utf-8‘))
while True:
    client_raw = input(‘:‘).strip()
    sk.sendall(bytes(client_raw,‘utf-8‘))
    server_replay = sk.recv(1024)
    print(str(server_replay,‘utf-8‘))
sk.close()

代码示例:聊天工具

#server端import socket
ip_port = (‘127.0.0.1‘,9998)

sk = socket.socket()
sk.connect(ip_port)

sk.sendall(bytes(‘这是 client !‘,‘utf-8‘))
server_replay = sk.recv(1024)
print(str(server_replay,‘utf-8‘))
while True:  #区别在这里,增加输入,然后返回
    client_raw = input(‘>> ‘).strip()
    sk.sendall(bytes(client_raw,‘utf-8‘))
    server_replay = sk.recv(1024)
    print(‘server:‘,str(server_replay,‘utf-8‘))
sk.close()
时间: 2024-10-13 12:03:46

Python高级之Socket 探索(五)的相关文章

python高级之网络编程

python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说到网络通信,那就不得不说TCP/IP协议簇的OSI七层模型了,这个东西当初在学校都学烂了...(PS:毕竟本人是网络工程专业出身...) 简单介绍下七层模型从底层到上层的顺序:物理层(定义物理设备的各项标准),数据链路层(mac地址等其他东西的封装),网络层(IP包头的的封装),传输层(TCP/UD

老男孩Python高级全栈开发工程师【真正的全套完整无加密】

课程大纲 老男孩python全栈,Python 全栈,Python教程,Django教程,Python爬虫, scrapy教程,python高级全栈开发工程师,本套教程,4部分完整无缺,课程完结,官方售价6800元. 课程全部都是不加密,全部都有声音-不是网上那种几块钱十几块钱那种加密没有声音或者课程不全,贪便宜花冤枉钱不说都会严重影响学习,耽误大量时间! 本套全栈课程,不说完全媲美线下教学,只要你肯坚持,不会比面授差太多-坚持学完找一份python开发类的工作完全没问题,另外对于学习方面的投资

三.python高级

三.python高级 1.元类 1.1 Python 中类方法.类实例方法.静态方法有何区别? 类方法:是类对象的方法,在定义时需要在上方使用@classmethod进行装饰,形参为cls,表示类对象,类对象和实例对象都可调用: 类实例方法:是类实例化对象的方法,只有实例对象可以调用,形参为 self,指代对象本身: 静态方法:是一个任意函数,在其上方使用@staticmethod进行装饰,可以用对象直接调用, 静态方法实际上跟该类没有太大关系 2.内存管理与垃圾回收机制 2.1 Python

python基础之socket编程

python基础之socket编程   一 TCP/IP五层模型 在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的. 在每一层实现的协议也各不同,即每一层的服务也不同.下图列出了每层主要的协议. 各层功能 注明:ARP和RAPR两个到底属于哪一层呢? 由于IP协议使用了ARP协议,所以经常把ARP协议划到网络层,但是ARP协议是为了从网络层使用的IP地址解析出在数据链路层使用的MAC地址,所以有些地方也把ARP协议划分到数据链路层,但是一般情况下

老男孩python高级运维开发课程

L老男孩培训-python培训二期lesson01(11节)01-第一天内容介绍及课前思想02-python介绍及发展03-python 发展04-python安装05-python编程风格06-raw_input用户交互07-用户交互及格式化输出08-python流程控制if_for_while09-python练习程序_员工信息表10-python练习程序_员工信息表_基本实现11-员工信息表_脚本bug处理 L老男孩培训-python培训二期lesson02(9节)01-学生作业讲解展示0

Python 基础之socket编程(二)

Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 1. tcp的服务端 ss = socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听链接 inf_loop: #服务器无限循环 cs = ss.accept() #接受客户端链接 comm_loop: #通讯循环 cs.recv()/cs.

Python学习记录-socket编程

Python学习记录-socket编程 学习 python socket Python学习记录-socket编程 1. OSI七层模型详解 2. Python socket 3. socket()函数 4. TCP socket通信流程 5. Python Internet 模块 1. OSI七层模型详解 以上图见:http://blog.csdn.net/yaopeng_2005/article/details/7064869 其它详情可参考:socket网络基础 2. Python sock

Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Python高级编程和异步IO并发编程,把每个Python高级知识点从起因到原理讲透的课程全网难寻 第1章 课程简介第2章 python中一切皆对象第3章 魔法函数第4章 深入类和对象第5章 自定义序列类第6章 深入python

Python 网络编程socket大全 用途---用于客户端和服务器端之间相互通讯

本章目录 一.什么是socket 二.为什么需要socket 三.socket的发展 四.python中的socket 五.基于TCP的socket 六.基于UDP的socket 六. 粘包问题详解 七.粘包的解决方案 八.socketserver实现并发通讯 **引入:为什么一定要先学习网络协议?** 之所以学习网络编程就是为了让我们的程序能够利用网络来传输数据,开发出C/S构架的应用程序 而网络的核心,就是协议,没有协议就没有互联网,我们要开发出C/S结构程序则必须遵循这些协议的标准! `就