python之拷贝内存管理和如何在控制台建立网络通讯

拷贝内存管理和socket

一、拷贝

from copy import copy, deepcopy


class Dog:
    def __init__(self, name, color='黑色'):
        self.name = name
        self.color = color


class Person:
    def __init__(self, name, age=0, gender='女'):
        self.name = name
        self.age = age
        self.gender = gender
        self.dog = None

    def __repr__(self):
        return f'<{str(self.__dict__)[1:-1]}, id:{id(self)}>'


p1 = Person('小明')
print(p1)

1.直接赋值

p2 = p1
print(p2)
p2.name = '小花'
print(p2)
print(p1)

2.拷贝

不管怎么拷贝,都是复制原数据产生一个新的数据并且将新数据的地址返回

p1 = Person('小明')
print('p1:', p1)
p3 = copy(p1)
p4 = deepcopy(p1)
print('p3:', p3)
print('p4:', p4)

3.浅拷贝和深拷贝的区别

print('=================浅拷贝=================')
p1 = Person('Tom', 18, '男')
p1.dog = Dog('大黄', '黄色')
print('p1:', p1)
# 浅拷贝
p2 = copy(p1)
print('p2:', p2)
p2.dog.color = '绿色'
print(p1.dog.color)

print('================深拷贝====================')
p1 = Person('Tom', 18, '男')
p1.dog = Dog('大黄', '黄色')
print('p1:', p1)
# 深拷贝
p2 = deepcopy(p1)
print('p2:', p2)
p2.dog.color = '绿色'
print(p1.dog.color)

二、内存管理

1.内存管理:

python内存管理是自动化(指的是对堆上的内存进行管理)

2.内存的开辟

"""
只要需要保存数据的时候系统就会自动在堆上开辟内存空间保存数据。
注意:如果需要被保存的数据是数字或者字符串,系统会先检查专门保存数字字符串的的缓存区中是否已经存在这个数据,如果存在直接返回之前的数据的地址,不存在才会开辟新的内存去保存。(短小数字和字符串)
"""
str1 = 'abc'
list1 = ['abc', 10, 20]
print(id(str1), id(list1[0]))   # 4468066352 4468066352

list2 = []
list3 = []
print(id(list2), id(list3))   # 4467411936 4468530144

num1 = -6
num2 = -6
print(id(-6), id(-6))

3.内存的释放(垃圾回收)

"""
Python中的每一个数据都有一个属性用来保存这个数据的引用个数(引用计数),当引用计数的值为0,那么这个数据就会自动销毁
"""


class Person:
    pass


Person()

三、server

1.socket

"""
socket又叫套接字(实现通信的两个端(程序)就是套接字)
套接字有两种:服务器套接字(server)、客户端套接字(client)
"""

2.服务器套接字

from socket import socket
# 1)创建socket对象(买电话机)
"""
socket(family=AF_INET, type=SOCK_STREAM)   -  创建一个套接字对象
family  -  IP的类型(ipv4, ipv6);
           AF_INET == ipv4 (默认的)
           AF_INET6 == ipv6
type  -   传输类型(TCP、UDP)
          SOCK_STREAM  == TCP
          SOCK_DGRAM  == UDP
"""
server = socket()

# 2)绑定ip和端口(插电话线)
"""
套接字对象.bind((ip地址,端口))
ip地址  -  找到到服务器对应的计算机;字符串
端口  - 区分计算机中不同的服务(服务指的是正在运行的程序); 整数,范围是0~65535(其中0~1023属于著名端口)
"""
server.bind(('10.7.184.61', 8082))

# 3)开始监听(等待别人打电话)
"""
服务器套接字对象.listen(数量)    -  数量决定了同一时间的最大通信数(能处理的客服端最大数量)
"""
server.listen(512)

# 4)让服务器一直运行
while True:
    print('等待电话...')
    # 1)接受客户端的请求(接电话)
    connect, address = server.accept()
    print('通话...')
    # 2)接受消息
    # recv(字节数)  - 接受数据(字节数-一次能接受的最大的数据)
    re_data = connect.recv(1024)
    print(f'接受数据:{address[0]}')
    print(str(re_data, encoding='utf-8'))

    # 3)发送消息
    # with open('index.html', 'r', encoding='utf-8') as f:
    #     message = f.read()
    # connect.send(bytes('HTTP/1.1 200 OK\r\n\r\n '+message, encoding='utf-8'))
    connect.send('吃了!'.encode())

四、client

1.创建套接字

from socket import socket
client = socket()

2.连接服务器

from socket import socket
client.connect(('10.7.184.61', 8082))

while True:
client.connect(('10.7.184.61', 8082))

while True:
client.connect(('10.7.184.61', 8082))

while True:
 # 3.发送消息
    # 字符串.encode() - 将转换成二进制数据
    message = input('>>>:')
    client.send(message.encode(encoding='utf-8'))

    # 4.接受消息
    # 二进制数据.decode() - 将二进制数00
    re_data = client.recv(1024)
    print(re_data.decode(encoding='utf-8'))

五、server持续通信

from socket import socket

server = socket()
server.bind(('10.7.184.61', 8082))
server.listen(512)
# 让服务器一直运行
while True:
    print('等待...')
    connect, address = server.accept()

    # 建立连接后可以一直通话
    while True:
        re_data = connect.recv(1024)
        print(f'{address[0]}:{re_data.decode()}')
        if re_data.decode() == '拜拜':
            break

        message = input('>>>')
        connect.send(message.encode())
        if message == '拜拜':
            break
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值