python入门学习篇二十六

基于tcp协议的套接字编程

######################################链接循环############################################
# 1. 实例化对象socket
import socket

# 2. 得到对象
# 2.1. 如果不传参数,代表的是TCP协议:SOCK_STREAM
# 2.2 type=socket.SOCK_DGRAM => UDP协议

# server = socket.socket(type=socket.SOCK_STREAM)
server = socket.socket()

# 3. 绑定
server.bind(('127.0.0.1', 8002))

# 4. 监听, 数字代表的是半连接池
server.listen(3)

print('服务端开始接收客户端消息了:')
# 5.
# sock: 当前连接的客户端对象
# addr: 客户端的地址
while True:
    sock, addr = server.accept()

    # 6. 接收客户段发送的消息
    # 1024代表的是字节数,接收数据的最大字节数
    # 粘包现象
    data = sock.recv(1024)  # hello
    print('客户端数据:', data)

    # 7. 给客户端返回数据
    sock.send(data.upper()) # HELLO

    # 8. 断开连接
    sock.close()

# 9. 关门
server.close()


################################客户端##################################################
# 1. 实例化对象
import socket
client = socket.socket()


# 2. 连接
client.connect(('127.0.0.1', 8002))

# 3. 给服务端发送数据,发送的数据类型必须是字节类型
client.send('hello1111'.encode('utf-8'))

# 4. 接收服务端发送过来的数据
data = client.recv(1024)
print('服务端的数据:', data)

# 5. 断开连接
client.close()

加上通信循环

# 1. 实例化对象socket
import socket

# 2. 得到对象
# 2.1. 如果不传参数,代表的是TCP协议:SOCK_STREAM
# 2.2 type=socket.SOCK_DGRAM => UDP协议

# server = socket.socket(type=socket.SOCK_STREAM)
server = socket.socket()

# 3. 绑定
server.bind(('127.0.0.1', 8002))

# 4. 监听, 数字代表的是半连接池
server.listen(3)

print('服务端开始接收客户端消息了:')
# 5.
# sock: 当前连接的客户端对象
# addr: 客户端的地址
while True:

    sock, addr = server.accept()

    # 6. 接收客户段发送的消息
    # 1024代表的是字节数,接收数据的最大字节数
    # 粘包现象
    while True:
        try:

            data = sock.recv(1024)  # hello
            if len(data) == 0:
                continue
            print('客户端数据:', data)

            # 7. 给客户端返回数据
            sock.send(data.upper()) # HELLO

        except Exception as e:
            print(e)
            break


    # 8. 断开连接
    sock.close()

# 9. 关门
server.close()
#########################################服务端#############################################
# 1. 实例化对象
import socket
client = socket.socket()


# 2. 连接
client.connect(('127.0.0.1', 8002))

while True:
    input_data = input('请输入要发送的数据:')

    # 3. 给服务端发送数据,发送的数据类型必须是字节类型
    client.send(input_data.encode('utf-8'))

    # 4. 接收服务端发送过来的数据
    data = client.recv(1024)
    print('服务端的数据:', data)

# 5. 断开连接
client.close()

基于udp协议的套接字编程

#################服务端############################
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
server.bind(('127.0.0.1', 8080))

while True:
    data, client_addr = server.recvfrom(1024)
    print('===>', data, client_addr)
    server.sendto(data.upper(), client_addr)

server.close()

#####################客户端########################################
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP

while True:
    msg = input('>>: ').strip()  # msg=''
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    data, server_addr = client.recvfrom(1024)
    print(data)

client.close()
进程的理论
程序:一堆代码,没有生命周期
进程:动态的,是有生命周期的
eg:
    菜谱就是程序,做菜的过程就是进程
    
线程:真正干活的人,而进程不是真正干活的人
一个进程中可以开多个线程
'''一个进程中至少要有一个线程'''

# 进程和线程全部都是有操作系统来调度的
ps: 协程(程序员来调度的)

# 进程   >>>   线程    >>> 协程

补充:
    '''
        CPU的工作机制:
            1. 当程序遇到i/o的时候,cpu会自动剥夺执行权限
                i/o:
                    又称为i/o密集型,i: input, o:output
                    import time
                    print(123)
                    time.sleep(3)
                    print(1)
                    
                计算密集型:需要消耗CPU资源
            2. 当程序占用时间过长的时候,也会剥夺执行权限    
                    
    '''

进程的并行和并发

并行:是同一时刻,执行任务
并发:在一段时间内,看似同时执行

1. 单核CPU能不能实现并行?
    肯定不行。
2. 在双十一时,淘宝的大量用户佣金网站,是并行还是并发?
    并发
# 总结:要想实现并行,CPU必须具备多核。

高并发:在一段极小的时间段内,佣金大量的任务。

阻塞和非阻塞,同步和异步

同步和异步关注的是消息通信机制 

四种状态:
    1. 同步阻塞:效率最低的
    2. 同步非阻塞
    3. 异步阻塞
    4. 异步非阻塞:效率是最高的

如何开启进程

from multiprocessing import Process


def write_file():
    with open('a.txt', 'w', encoding='utf-8') as f:
        f.write('hello')


# 主动开启进程执行这个任务

'''注意事项:在windows系统中,开启进程必要要写在__main__中'''
if __name__ == '__main__':
    # 1. 开启进程
    p = Process(target=write_file)

    # 2. 真正的开启进程
    p.start()

Process类中的参数使用

from multiprocessing import Process


def write_file(a, b, c, name, age):
    # with open('a.txt', 'w', encoding='utf-8') as f:
    #     f.write('hello')
    print('a: ', a)
    print('name: ', name)

# 主动开启进程执行这个任务

'''注意事项:在windows系统中,开启进程必要要写在__main__中'''
if __name__ == '__main__':
    # 1. 开启进程

    '''
        name=None, 用来修改进程名称
        args=(), kwargs={}
    '''
    p = Process(target=write_file, name='aaaaaa', args=(1, 2, 3), kwargs={'name':'ly', 'age':19})

    # 2. 真正的开启进程
    p.start()

    print(p.name) # Process-1  进程名称

Process类的属性和方法

from multiprocessing import Process


def write_file(a, b, c, name, age):
    # with open('a.txt', 'w', encoding='utf-8') as f:
    #     f.write('hello')
    import time

    time.sleep(100)
    print('a: ', a)
    print('name: ', name)

# 主动开启进程执行这个任务

'''注意事项:在windows系统中,开启进程必要要写在__main__中'''
if __name__ == '__main__':
    # 1. 开启进程

    '''
        name=None, 用来修改进程名称
        args=(), kwargs={}
    '''
    p = Process(target=write_file, name='aaaaaa', args=(1, 2, 3), kwargs={'name':'ly', 'age':19})

    # 2. 真正的开启进程
    p.start()

    # print(p.name) # Process-1  进程名称
    print(p.pid)

 

搜索

复制

上一篇:优雅的将Object转换成List,避免Unchecked cast:


下一篇:关于Eclipse部署openfire3.8.2源码的体会