微信小程序与python服务器进行http通信

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()

​

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
为什么需要websocket? 传统的实时交互的游戏,或服务器主动发送消息的行为(如推送服务),如果想做在微信上,可能你会使用轮询的方式进行,不过这太消耗资源,大量的请求也加重了服务器的负担,而且延迟问题比较严重。如果是自己开发的app,为了解决这些问题,很多团队会自建socket,使用tcp长链接、自定协议的方式与服务器进行相对实时的数据交互。有能力的团队,采用这种方式自然没什么大问题。不过小团队可能就要花费很多时间去调试,要解决很多难题,这个在成本上就划不来。 H5引入了webSocket来解决网页端的长链接问题,而微信小程序也支持websocket。这是一个非常重要的特性,所以本系列的文章会专门拿出一篇来讨论websocket。 webSocket本质上也是TCP连接,它提供全双工的数据传输。一方面可以避免轮询带来的连接频繁建立与断开的性能损耗,另一方面数据可以是比较实时的进行双向传输(因为是长链接),而且WebSocket允许跨域通信(这里有个潜在的跨域安全的问题,得靠服务端来解决)。目前除IE外的浏览器已经对webSocket支持得很好了,微信小程序再推一把之后,它会变得更加流行。 我们来设计一个新的demo,一个比较有趣的小游戏,多人版扫雷,准确地讲,多人版挖黄金。 游戏规则是这样的:把雷换成金子,挖到金子加一分,每人轮流一次(A挖完轮到B,B挖完A才能再点击),点中金子就算你的,也不会炸,游戏继续,直到把场上所有的金子都挖完游戏才结束。跟扫雷一样,数字也是表示周边有几个金子,然后用户根据场上已经翻出来的数字来猜哪一格可能有金子。 这种交互的游戏难点在于,用户的点击操作都要传到服务器上,而且服务器要实时的推送到其它玩家的应用上。另外用户自己也要接收对方操作时实时传过来的数据,这样才不至于重复点中同一个格子。简单讲,就是你要上报操作给服务器,而服务器也要实时给你推消息。为了简化整个模型,我们规定玩家必须轮流来点击,玩家A点完后,才能轮到玩家B,玩家B操作完,玩家A才能点。 我们分几步来实现这个功能。 一、实现思路 1、第一步,我们要先生成扫雷的地图场景 这个算法比较简单,简述一下。随机取某行某列就可以定位一个格子,标记成金子(-1表示金子)。mimeCnt表示要生成的金子的数量,用同样的方式循环标记mimeCnt个随机格子。生成完后,再用一个循环去扫描这些-1的格子,把它周边的格子都加1,当然必须是非金子的格子才加1。代码放在这里。 其中increaseArround用来把这格金子周边的格子都加1,实现也比较简单: 执行genMimeArr(),随机生成结果如下: -1表示金子。看了下貌似没什么问题。接下去,我们就要接入webSocket了。 (这个是js版本的,其实生成地图场景的工作是在后台生成,这个js版本只是一个演示,不过算法是一样的。) 2、我们需要一个支持webSocket的服务端 本例子中,我们使用python的tornado框架来实现(tornado提供了tornado.websocket模块)。当然读者也可以使用socket.io,专为webSocket设计的js语言的服务端,用起来非常简单,它也对不支持webSocket的浏览器提供了兼容(flash或comet实现)。 笔者本人比较喜欢使用tornado,做了几年后台开发,使用最多的框架之一的就是它,NIO模型,而且非常轻量级,同样的rps,java可能需要700-800M的内存,tornado只要30-40M,所以在一台4G内存的机子上可以跑上百个tornado服务,而java,对不起,只能跑3个虚拟机。微服务的时代,这一点对小公司很重要。当然如果读者本人对java比较熟悉的话,也可以选择netty框架尝试一下。 webSocket用tornado的另一个好处是,它可以在同一个服务(端口)上同时支持webSocket及http两种协议。tornado的官方demo代码中展示了怎么实现同时使用两种协议。在本游戏中,可以这么用:用户进入首页,用http协议去拉取当前的房间号及数据。因为首页是打开最多的,进了首页的用户不一定会玩游戏。所以首页还没必要建立webSocket链接,webSocket链接主要用来解决频繁请求及推送的操作。首页只有一个请求操作。选了房间号后,进去下一个游戏页面再开始建立webSocket链接。 3、客户端 使用微信小程序开发工具,直接连接是会报域名安全错误的,因为工具内部做了限制,对安全域名才会允许连接。所以同样的,这里我们也继续改下工具的源码,把相关的行改掉就行修改方式如下: 找到asdebug.js的这一行,把它改成: if(false)即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值