day19网络通信过程TCP/IC协议

2018-10-24  本文已影响0人  PythonLi

网络通信过程

socket又叫套接字,指的是实现网络通信的两端。分为服务器对应的套接字和客户端对应的套接字
python 通过提供socket标准库来支持socket编程。
socket编程就是用程序实现服务器和客户端
服务器.bind(())给服务器绑定ip和端口
客户端.connect(()) 给客户端绑ip和端口
send发送 recv 接收
str.encode('utf-8') 字符串转二进制 send的时候
bytes.docode('utf-8')二进制转字符串 recv的时候
服务器发送接收的时候要用 conversation.send/recv

1.写一个socket服务器程序
import socket
#1.创建服务器对应的套接字对象(买了一个电话座机)
server=scoket.scoket()
#scoket有两个默认值参数。scoket(family=ipv4,type=TCP可靠传输)
# 创建一个基于ipv4的可靠服务器的套接字#已经有了默认值ipv4和TCP

2.绑定ip和端口(插了一根电话线-确定电话号码)
bind((ip,端口)) 参数是一个元组
ip:服务器的地址
端口: 不同的端口用来区分电脑上不同服务。取值范围是0-65535,注意0-1024属于著名端口
著名端口-->用来绑定特殊服务的端口,不要随便用
同一时间同一端口稚嫩绑定一个端口

server.bind(('10.7.156.23',32534))
  1. 监听请求(交电话费)

listen(个数)---> 需要通过数字来设置服务器一次可以处理的最大的请求个数

server.listen(666)
print('开始监听')

4.让服务器一直处于开启状态
send(data)--->发送数据
data: 需要发送的数据,要求是二进制数据(bytes)

字符串转二进制
a.str ---> bytes:
1.bytes(字符串,enconding='utf-8')
2.字符串.encode(编码方式)
#conversation,addr = server.accept
#接收客户端请求,如要一直开启就用while true循环
While True:
    conversation,addr = server.accept
   #打印请求地址
    print(addr)
    # 服务器给客户端发送数据(开始说话)
    message = input('服务器:')
    message_data = message.encode('utf-8')#输入的信息转换成二进制
    conversation.send(message_data)#发送二进制文件

5.接收客户端发送的消息

data = conversation.recv(1024)# 1024表示一次接收的数据大小
re_message = data.decode('utf-8')#将接收到的二进制文件转换成str
print(re_message)

recv(字节数) ---> 接受从客户端发送的数据,参数是用来设置一次能接收的最大字节数
返回值是接收到的数据,数据是二进制

bytes  转 字符串
str()
二进制.decode()

注意:recv方法也会阻塞线程,程序运行到这儿也会停止运行,等到对方发送消息为止
2.socket客户端
import socket
client = socket.scoket()#创建套接字对象
#连接服务器
client.connect(('10.7.156.23',32534))
#给服务器发送消息
message =input( '客户端说:')
client.send(message.encode('utf-8'))
if message == '拜拜'
    break #说拜拜让程序结束
# 接收服务器返回数据
new_message = client.recv(1024)
print(‘客户端说:’+new_message.decode('utf-8'))

3.给服务器升级(持续运行)
import scoket
server = scoket.scoket() #创建服务器
server.bind(('10.7.156.23',32534)) # 绑定ip
server.listen(199)#设置监听请求次数
# 用一个while True循环来持续运行服务器
while True:
    conversation,addr = server.accept()
    print(addr)
    while True:
            message_re =conversation.recv(1024).docode('utf-8')#接收消息,二进制转字符串
            print(''客户端%s:' % addr[0][-2:]'+message)
            message = input('服务器说:')
            conversation.send(message.encode('utf-8'))

4.接收图片的客户端
import  socket
client = scoket.scoket()
client.connect(('10.7.156.23',32534))
message = client.recv(1024) #接收到的二进制文件
data = bytes()
while message:
      data += message 
      message = client.recv(1024)
with open('.aaa.jpg','wb')as f:
          f.write(data)
print('接收完成')
#==================服务器发送文件==============
with open('.bbb.jpg''rb')as f:
      message = f.read()
      conversation.send(message)
      conversation.close()#这里要主动关闭图片文件


5.requests请求

Python没有一个标准库来支持网络请求,但目前有一个第三方库支持http请求
requests.get(url,parmas) --> 返回服务的响应
url-->请求地址
params---> 客户端给服务器发送的数据(字典){参数名:值}

import resquests
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
response = requests.get(url)
# 1. 获取响应头
print(response.headers)
# 获取响应头
print(response.hearders)
# 2.拿二进制形式的响应体
data_byte = response.content
print(data_byte,type(data_byte))

# 3.拿字符串形式的响应体
data_text = response.text
print(type(data_text),data_text)

# 4.拿json格式对应的python数据
data_json = response.json()
print(type(data_byte))

image_message = resquests.get('http://img4.imgtn.bdimg.com/it/u=4097616506,16220324&fm=200&gp=0.jpg')
re_image = image_message.content# 拿到响应体的二进制
with open ('.aaa.jpg','wb') as f:
    f.write(re_image)

6.http

URL基本格式 = 协议://主机地址/路径
url协议
HTTP,超文本传输协议,访问远程的网络资源,格式是http://
是最常用的协议

特点:
简单快速。因为http协议简单,所有http服务器的程序规模小,因为通信速度很快
灵活。 http允许传输各种各样的数据
http 0.9和1.0 使用非持续连接
限制每次连接只处理一个请求,服务器对客户端的请求做出相应,马上断开连接。

通信过程

200 OK 请求成功
400 Bad Request 客户端请求语法错误,服务器无法解析
404 无法找到客户端请求的资源
500 服务器内部错误

TCP/IC协议

OSI参考模型 TCP/IC协议栈 分层
应用层 HTTP/HTTPS\(网络请求) 前三个都属于应用层
表示层 HTTP/HTTPS\(网络请求) FTP DNS
会话层 HTTP/HTTPS\(网络请求)
传输层 TCP(可靠传输)UDP(不可靠传输) 传输层
网络层 ARP IP ICMP IGMP 网络层
数据链路层 Ethernet ATM Frame Replay 数据链路层
物理层 Ethernet ATM Frame Replay 物理层

应用层:所有能产生网络流量的程序(QQ,浏览器、有道)
表示层:数据传输前的压缩、加密、确定编码方式等操作
会话层:查看木马(netstat -nb)(只要需要网络请求,就必定会建立会话)
传输层:可靠传输、不可靠传输、流量控制
网络层:负责选择最佳路径、规划IP地址
数据链路层:帧的开始和结尾、透明传输、查错校验
物理层:接口标准、电器标准

数据封装过程:应用层的上层数据到传输层加上TCP(TCP+上层数据)头再到网络层加上IP头(IP+TCP+上层数据)再到数据链路层加MAC头和FCS尾(MAC+IP+TCP+上层数据+FCS)再到物理层转换成二进制
数据解封过程正好相反。后往前一层一层的去掉添加的附加信息
在TCP/IP协议中传输层有两个协议TCP可靠传输和UDP不可靠传输
常用的是TCP可靠传输,tcp协议用于数据需要分段传输,会建立会话层,传输过程当段数据后收到客户端的确认返回才会传输下一段传输直到传输完成。UDP协议则是不需要分段传输,也不需要创建会话层
TCP协议中如果无差错就会分段传输收到确认再传输,若传输中出现错误会超时重传数据
上一篇下一篇

猜你喜欢

热点阅读