学习日记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/O阻塞
I:input 输入
O:outpot 输出

计算密集型

 

posted @ 2021-07-19 20:38  小白白柏柏  阅读(202)  评论(0)    收藏  举报