学习日记25
socket抽象层
经常把socket翻译成套接字
socket是在应用层和运输层中的抽象层
用一个端口号加上ip就可以确定世界上唯一一台电脑的应用
socket中有很多接口可以帮助我们去控制运输层以下的功能
基于tcp协议的套接字编程
软件架构
c/s: client sever
b/s: browser sever
# 服务端
socked() # 调用socked对象
bind() # 绑定ip和端口
listen() # 监听客户端
accept() # 接收信息,阻塞直到有客户连接
write() # 发送数据
read() # 接受数据
close() # 关闭当前的连接对象
# 客户端
connect() # 建立连接
write() # 发送数据
read() # 接受数据
close() # 关闭当前的连接对象
#建立服务端
import socket
# 第一个socket是模块名,第二个socket是类名
server = socket.sockest()
# 不传就默认tcp协议
server = socket.sockest(family = socket.AF_INET, type = socket.SOCK_STREAM)
# 绑定监听器上的地址
# 默认http协议的默认端口是80
# 默认https协议的默认端口是443
server.bind('127.0.0.1',8080)
# listen监听,半连接池,强调:不是同时服务5个
server.listen(5)
# 接收消息
#sock当前来连接对象 addr 客户端的地址 ip+port
sock, addr = server.appept()
# 最多接受1024字节
data = sock.recv(1024)
# 字符串大写
sock.send(data.upper())
# 断开当前连接对象
sock.close()
# 断开服务器不再接收信息
server.close()
#建立客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
# 发送二级制数据
client.send(b'sh')
client.close()
常用端口号
21.20 : FTP : TCP
69 : FTIP : UDP
23 : TELET : TCP
25 : SMTP : TCP
53 : DNS : UDP
80 : HTTP :TCP
22 : SSH : TCP
3306 : MYSQL :TCP
优化代码(加入链接循环)
# 服务端
import socket
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
print('正在接受消息')
while True:
sock, addr = server.accept()
print(sock)
print(addr)
while True:
try:
data = sock.recv(1024)
if len(data) == 0:
break
print(data)
sock.send(data.upper())
except Exception as e:
print(e)
break
sock.close()
server.close()
# 客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
while True:
input_data = input('请输入要传输的数据(q to quit ):').strip()
if not input_data:continue
if input_data == 'q':
break
client.send(input_data.encode('utf-8'))
data = client.recv(1024)
print(data)
client.close()
基于udp协议的套接字编程
# 创建服务器
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
data, client_addr = server.recvfrom(1024)
print(data)
# client_addr 客户端地址
print(client_addr)
server.sendto(data.upper(),client_addr)
server.close()
# 创建客户端
import socket
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
while True:
msg = input('请输入要传输的数据(q to quit ):').strip()
if msg == 'q':
break
client.sendto(msg.encode('utf-8'),('127.0.0.1', 8080))
# 接收服务器返回的数据
data,server_addr = client.recvfrom(1024)
print(data)
client.close()
并发编程
什么是进程
Process(进程):是系统进行资源分配和调度的基本单位,进程是线程的容器,线程是操作系统操作的最小单位
程序和程序:
程序是静态的,没有生命周期
进程是动态的,有生命周期(是一次执行过程)
FCFS:先来先服务,最简单的调度方法
SJ/PF: 是短进程优先调度的算法
RR:时间片轮转法,进程等待的时间和享受的时间成正比
进程的三种状态
就绪态:等待
运行态:进行中
阻塞态:
I/O密集型
I/O阻塞
I:input 输入
O:outpot 输出
计算密集型

浙公网安备 33010602011771号