1.HTTP协议
HTTP通常基于TCP/IP协议栈进行传输,使用TCP作为可靠的传输协议。HTTP协议是互联网上最常用的协议之一,被用于各种网络应用,如网页浏览、文件传输、API请求等。
HTTP(Hypertext Transfer Protocol)是一种用于在网络中传输超文本的通信协议。HTTP通信由客户端和服务器之间进行,客户端发送HTTP请求,服务器通过HTTP响应返回相应的结果。下面是HTTP通信的基本格式:
1.HTTP请求格式:
Method Request-URI HTTP-Version
Headers
Request Body
- Method:表示请求的方法,常见的有GET、POST、PUT、DELETE等。
- Request-URI:表示请求的资源路径,可以是绝对路径或相对路径。
- HTTP-Version:表示使用的HTTP协议版本,如HTTP/1.1。
- Headers:包含了请求的各种头部信息,用来传输各种参数和描述。
- Request Body:包含了请求的主体数据,通常用于POST请求发送数据。
2. HTTP响应格式:
HTTP-Version Status-Code Reason-Phrase
Headers
Response Body
- HTTP-Version:表示使用的HTTP协议版本,如HTTP/1.1。
- Status-Code:表示服务器对请求的处理结果的状态码,如200(OK)、404(Not Found)等。
- Reason-Phrase:状态码的原因短语,对状态码的简短描述。
- Headers:包含了响应的各种头部信息,用来传输各种参数和描述。
- Response Body:包含了响应的主体数据,通常是所请求资源的内容。
2.微信小程序
test.ts
Page({
/** * 页面的初始数据
*/
data: {
phone:"",
code:"",
test:"",
},
bindCode:function(e: any){
var that = this
wx.request({
url: 'http://192.168.6.8:9090',
data:{},
method:"GET",
success:function(res){
console.log(res.data)
that.setData({code:res.data});
}
})
},
bindPhone:function(e: { detail: { value: any; }; }){ //实时更新数据
this.setData({phone:e.detail.value});
//console.log(this.data.phone)
},
getvalue:function(e: { detail: { value: any; }; }){//失去焦点时更新数据
this.setData({phone:e.detail.value});
//console.log(this.data.phone)
},
denglu:function(){
var that = this
//console.log(this.data.phone ,this.data.code)
wx.request({
url: 'http://192.168.6.8:9090',
data:{phone:this.data.phone},
method:"POST",
success:function(res){
//console.log(res.data.xinxi)
console.log(res)
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
}
})
test.wxml
<view>请输入发送数据:</view>
<input value="{{phone}}" bindinput="bindPhone" placeholder="输入发送的内容" bindblur="getvalue">{{phone}}</input>
<button bindtap="denglu">发送</button>
<view> -------------------------------------------</view>
<view>
<button bindtap="bindCode">点击收到消息</button>
</view>
<view >收到的消息:{{code}}</view>
3.python服务器
import socket
import threading
a = "hello,app"
# 处理客户端请求任务
def handle_client_request(ip_port, new_client):
print("ip和端口号为:", ip_port)
recv_data = new_client.recv(4096) # 接收最大字节为1024
if recv_data:
# 对二进制数据进行解码
recv_content = recv_data.decode("utf-8")
#print("接收客户端数据为:", recv_content, ip_port)
fenge = recv_content.split('/')
# print(fenge[0])
if fenge[0] == "POST ":
b = recv_content.split('"')
print(b[1], b[3])
# 响应行
response_line1 = "HTTP/1.1 200 OK\r\n"
# 响应头
response_header1 = "Server: PWS/1.0\r\n"
response = response_line1 + response_header1 + "\r\n" + "TRUE"
response_data = response.encode("gbk")
new_client.send(response_data)
else:
# 响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 响应头
response_header = "Server: PWS/1.0\r\n"
# 空行
# 响应体
response_body = "%s" % a
print(response_body)
# 把数据封装成http 响应报文的数据
response = response_line + response_header + "\r\n" + response_body
# 把字符串编码成二进制数据
response_data = response.encode("gbk")
# print(response_data)
# 6.发送到客户端
new_client.send(response_data)
new_client.close()
if __name__ == '__main__':
# 1.创建tcp服务端套接字
# socket.AF_INET: ipv4地址类型
# socket.SOCK_STREAM: tcp传输协议类型
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用,表示服务端程序退出端口号立即释放
# 1。SOL_SOCKET:表示当前端口号
# 2.SO_REUSEADDR:表示端口号的选项
# 3.True:确定复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2.绑定端口号
# 第一个参数表示ip地址,不指定表示本机的任何一个IP地址
# 第二个参数表示端口号
tcp_server_socket.bind(("", 9090))
# 3.设置监听
# 128:表示等待建立连接的最大个数
tcp_server_socket.listen(128)
# 4.等待接收客户端的连接请求
# 注意点:每次连接都会返回一个新的套接字
# tcp_server_socket只负责等待接收连接请求,收发消息使用新的套接字
while (1):
new_client, ip_port = tcp_server_socket.accept() # 与客服端进行连接
# 连接成功,创建子线程,进行收发
sub_thread = threading.Thread(target=handle_client_request, args=(ip_port, new_client))
# 设置守护主线程,主线程退出,子线程直接销毁
sub_thread.setDaemon(True)
# 启动子线程对应的任务
sub_thread.start()
# 7.关闭服务器套接字,表示不再等待客户端的连接请求
tcp_server_socket.close()