socket套接字
基于tcp+链接循环+通信循环的socket套接字实现
服务端.py
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 第一个参数是family这个代表的是套接字家族
# 第二个参数是type代表的是tcp协议
server.bind(('127.0.0.1', 8080)) # 服务端绑定端口和ip
server.listen(5) # 半连接池
while True:
conn, addr = server.accept() # 链接循环,建立连接
print(f'{addr}链接建立成功')
while True: # 通信循环
try: # 捕捉异常
data = conn.recv(1024) # 收数据,1024字节
if len(data) == 0: # 如果收到的数据为空,就结束通信循环
break
print(f"从客户端接收到的数据: {data.decode('utf-8')}")
msg = input('>>>').strip()
conn.send(msg.encode('utf-8')) # 发送数据
except Exception as e:
print(e)
break
conn.close()
server.close()
客户端.py
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080)) # 客户端建立与服务端的通信
while True: # 通信循环
msg = input('(q to quit)>>>').strip()
if msg == 'q':
break
if len(msg) == 0:continue
client.send(msg.encode('utf-8')) # 发送数据
data = client.recv(1024) # 接受数据
print(f"接受服务端发送的数据: {data.decode('utf-8')}")
client.close()
套接字函数
服务端套接字函数
"""
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
"""
客户端套接字函数
"""
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
"""
公共用途的套接字函数
"""
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据
(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
"""
基于udp协议
服务端.py
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
data, addr = server.recvfrom(1024)
server.sendto(data.upper(), addr)
print(addr)
server.close()
客户端.py
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
msg = input('>>>').strip()
if not msg:continue
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
data, addr = client.recvfrom(1024)
print(data)
常用端口
21/tcp FTP 文件传输协议
22/tcp SSH 安全登录、文件传送(SCP)和端口重定向
23/tcp Telnet 不安全的文本传送
25/tcp SMTP Simple Mail Transfer Protocol (E-mail)
69/udp TFTP Trivial File Transfer Protocol
79/tcp finger Finger
80/tcp HTTP 超文本传送协议 (WWW)
88/tcp Kerberos Authenticating agent
110/tcp POP3 Post Office Protocol (E-mail)
113/tcp ident old identification server system
119/tcp NNTP used for usenet newsgroups
220/tcp IMAP3
443/tcp HTTPS used for securely transferring web pages
进程概念
系统进行资源分配和调度的基本单位
进程是线程的容器,一个程序的运行,必须要有一个进程,进程里面必须要有一个线程
进程是正在运行的程序实例,进程是动态的,程序是死的
操作系统的基本执行单元
动态产生,动态消亡,独立运行的基本单位,进程有一定的生命周期
同一个程序执行两次,就会在操作系统中出现两个进程
进程是暂时的,进程是一个程序执行的过程
"""
进程不是干活的,干活的是进程里面的线程, 线程是操作系统执行的最小单位
"""
协程:
"""
用来解决单核下的并发,给程序员用的
"""
进程的调度算法:
"""
先来先服务调度算法
短作业优先调度算法
时间片轮转法+多级反馈队列
"""
进程的三种状态:
"""
就绪态:装备运行
运行态:正在运行
阻塞态:io阻塞
"""
同步
'''
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
'''
异步
'''
异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。
'''
io密集型
input/output 输入输出
io阻塞
就是在输入或者输出状态
计算密集型
cpu处理,cpu来回快速的切换