原地址:http://www.9miao.com/question-15-53940.html

好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了。

但是,仅仅是连接了,可它们俩不说话不交流,那游戏就玩不起来了,玩不起来那我就赚不到钱..啊不是,玩不起来那玩家就不能开心了,钱是…啊不!玩家是最重要的嘛~不能让玩家不开心(小若:好好好,看出来了,钱是最重要的是吧)

好~!这次木头就和大家一起见证客户端和服务端的第一次交谈吧~!

声明:
本教程基于FireFly1.2.2版本、Python2.7版本。
本教程面向Python和FireFly初学者中的初学者(比如我)
本教程由笨木头花心贡献,花心?不,是用心~!
转载请注明原文地址:http://www.benmutou.com/blog/archives/727

1. Pythone struct模块
Struct模块主要是用来对数据进行打包和解包的,和LiberateFactory不一样,LiberateFactory已经说了,是协议工厂,当然就主要是对协议进行封装和解析。而struct是对更底层的数据操作,是把数据打包成二进制的形式,然后在网络中传输。解包也一样,把二进制形式的数据解包成Pythone需要或者说比较好识别的格式。
反正,总之,struct模块是对数据进行打包和解包的,解释完毕~

2. 可以发送请求的客户端(client.py)
我们要修改客户端,以便它可以发送数据给服务端。

  1. #coding:utf8

  2. '''

  3. Created on 2013-10-8

  4. @author: 笨木头_钟迪龙 www.benmutou.com

  5. '''

  6. from socket import AF_INET, SOCK_STREAM, socket

  7. import struct

  8. def sendData(sendstr, commandId):

  9. HEAD_0 = chr(0) # 协议头0

  10. HEAD_1 = chr(0) # 协议头1

  11. HEAD_2 = chr(0) # 协议头2

  12. HEAD_3 = chr(0) # 协议头3

  13. ProtoVersion = chr(0) # 协议头版本号

  14. ServerVersion = 0 # 服务器版本号

  15. sendstr = sendstr

  16. data = struct.pack('!sssss3I', HEAD_0, HEAD_1, HEAD_2, HEAD_3,\

  17. ProtoVersion, ServerVersion, len(sendstr) + 4, commandId)

  18. senddata = data + sendstr

  19. return senddata

  20. if __name__ == '__main__':

  21. HOST = "localhost" # 服务端地址

  22. PORT = 1000 # 服务端端口

  23. ADDR = (HOST, PORT)

  24. client = socket(AF_INET, SOCK_STREAM) # 创建socket,TCP

  25. client.connect(ADDR) # 连接服务器

  26. client.sendall(sendData('hello server', 1))# 发送数据给服务器

  27. while True:

  28. pass

复制代码

觉得复杂吗?其实就多了一个sendData函数而已。(小若:但是它很复杂!)

2.1 协议头部信息
我们先来解释一下协议头、协议头版本号、服务器版本号。我也没有深入了解,但就这么看,我唯一能想到的就是:这些东西是用来检测客户端和服务端是否同步的。

经过我“深入”FireFly源码之后,发现了确实有这么一个用途,当服务端的协议工厂接收到数据时,会先判断这些协议头和版本号是否正确,不正确的话,是不会往下继续执行的。
由于这是入门教程,就不一层层地贴这些代码了,也不继续深入了,因为它不是本文的重点。

重点是struct的pack函数,大家可以看看这篇文章:
http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html
只看第1、2点就暂时够用了。

于是,上面代码里的pack函数就是把4个协议头、协议头版本号、服务器版本号、发送的数据长度、命令码打包。
这样打包后的数据作为一个数据的头部信息,顾名思义,头部信息就是记录一次发送数据的主要信息,比如长度、版本、命令码。(小若:废话!上面都说了把这些东西打包了)

然后我们看看这句代码:senddata = data + sendstr。
为什么发送的数据字符串不需要参与打包呢?我也很白痴地试了一下把数据字符串也一起参与打包,结果是一样的。
于是,据我所知,字符串可以直接传输(字节流),不需要再进行什么打包了。

2.2 发送数据
客户端要发送数据给服务端很简单:client.sendall(sendData(‘hello server’, 1))
这句代码的意思是,发送字符串‘hello server’给服务端,命令码是1。
结合之前说的,命令码1会参与到数据头部信息一起打包,而字符串’hello server’是直接和打包后的数据连接的,不需要参与打包。

2.3 为什么数据长度要+4?
不知道大家会不会有个疑问,就是打包的时候这个参数:len(sendstr) + 4
为什么长度要+4,木头我是弄不明白了,我查看了源码,在解析头部信息的时候,获取数据长度值时,又减去了4。这看起来有点多此一举,据我目前的研究,还没法知道原因,希望高手支招。

转载于:https://www.cnblogs.com/123ing/p/3905096.html

[笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求相关推荐

  1. [笨木头FireFly 02]入门篇_客户端发送请求,服务器处理请求

    好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不说话不交流,那游戏就玩不起来了,玩不起来那我就赚不到钱..啊不是,玩不起来那玩家就不能开心了,钱 ...

  2. 【笨木头Unity】入门之旅010(完结):Demo之四处找死(五)_UI

    UI是游戏里必不可少的元素,在Unity里添加UI是比较轻松的事情,但要玩好它,可就不那么轻松了. 没关系,先入门. 笨木头花心贡献,啥?花心?不,是用心. 转载请注明,原文地址:http://www ...

  3. [笨木头FireFly 03]完整的服务端和客户端通信

    #PS: 其实这篇文件是2013.10.12写完的,一直没发布,因为从那天起,我又跑回去折腾客户端的东西了(打算用Cocos2d-x3.0做下一个游戏),以及我的老游戏的维护和更新.总之各种借口(小若 ...

  4. 【笨木头Unity】入门之旅005:正常人都要掌握的操作

    各位,对不起,我一直都很想快点进入代码的教程,但是不知道为什么,老是在编辑器这边徘徊. 这不,本篇又要介绍编辑器了,唉.(小若:好可怜-个屁吖,还不是你自己要介绍的!) 笨木头花心贡献,啥?花心?不, ...

  5. 【笨木头Unity】入门之旅006:Demo之四处找死(一)_场景和主角

    终于把一些基本的东西介绍完了,我不想再介绍无聊的菜单和快捷键了,这些东西大家自己在折腾的过程中慢慢熟悉就好. 有什么不懂的就问度娘,不喜欢度娘的,可以找谷歌. 这次,我们来开始一个很简单的Demo,我 ...

  6. 【笨木头Unity】入门之旅007:Demo之四处找死(二)_主角移动和旋转

    上一篇我们仅仅是创建了场景和主角,暂时不具备任何玩法. 这次,我们来看看怎么让主角移动起来. 笨木头花心贡献,啥?花心?不,是用心. 转载请注明,原文地址:http://www.benmutou.co ...

  7. 【笨木头Unity】入门之旅003:HelloWorld

    有人跟我说:你特么的都写了3篇了,什么实际的东西都没有.(小若:特么的根本就没人评论你的教程!) 这么说就不对了,教程只是配菜,吐槽才是主菜,你们觉得呢. 笨木头花心贡献,啥?花心?不呢,是用心~ 转 ...

  8. 【笨木头Unity】入门之旅002:不谈对象,咱们谈组件

    今天有人问了一个一直以来都让我很纠结的问题:木头为什么长得这么帅?(小若:不就是一个瞎子随便问了个问题嘛,至于吗?) 这,大家以后别问我这个问题了,我真的不知道怎么回答,我尝试过很多变丑的方法,但是都 ...

  9. 【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体

    有没有发现越往后写,旁白出现的次数越少? 是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作. 不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的. 笨木头花 ...

最新文章

  1. .NET Core开发日志——Runtime IDentifier
  2. [react] render函数中return如果没有使用()会有什么问题?
  3. 【Elasticsearch】Elasticsearch 集群协调迎来新时代
  4. 伦巴时间步的动作要领_拉丁舞教学视频,拉丁伦巴舞基本动作
  5. 常量池、栈、堆的比较
  6. 【水果识别】基于matlab GUI柑橘质量检测及分级系统(带面板)【含Matlab源码 1628期】
  7. Jeesite--- Datagrid 行高亮+单元格高亮
  8. 和平精英灵敏度分享码服务器没有响应,和平精英灵敏度分享码怎么弄 灵敏度分享码怎么用...
  9. matlab设计误码率,通信原理课程设计报告 数字传输系统误码率测试器的matlab实现及性能分析...
  10. 基于IBM Tivoli TSM系统构建某局备份系统实施方案
  11. 酷客多荣获“2018年度中国最具创新力小程序品牌”奖
  12. select函数用法详解
  13. 书法文化类毕业论文文献都有哪些?
  14. 2022.04.14【读书笔记】|转录因子分析
  15. python求两数最大公因数_使用辗转相除法求两个数的最大公因数(python实现)
  16. 期货现货升跌水(期货下跌现货一定下跌吗)
  17. 人人商城-数据选择器
  18. [CDQ分治与整体二分]个人对CDQ分治与整体二分的理解
  19. chdir: No such file or directory (chdir()函数、strtok()函数)
  20. 基于.NET实现的飞机订票系统

热门文章

  1. VSCode 代码风格统一设置eslint + stylelint
  2. uniapp ios时间戳获取不到_2折甩卖、货架被抢空…青岛这家大超市要关门,开业不到两年!停业时间戳...
  3. HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)
  4. Python笔记-centos7使用adb连接真实手机及初始化uiautomatro2项目
  5. 前端笔记-利用thymeleaf隐藏显示input及label
  6. mysql identity 获取_如何获取MySQL中Identity列的种子值?
  7. centos8.4 nginx 问题
  8. php跨服务器访问不了,php跨服务器访问方法小结
  9. mysql部署练习_MySQL主从练习 - osc_b9r67jnt的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 420集的python教程下载_阿里达摩院推荐的420集的python教程,据说懂中文就能入门高清版...