golang websocket总结(问题贴)

因为工作的需要,接触了websocket,开始的一些很简单的代码,都不知道该怎样运行起来,所以,总是有一层神秘感,却没有太多的兴趣去研究它。不过,还是免不了要了解一些才不至于对于后续的工作有影响。从塌下心来学习,到最后完成编码测试,不超过一周,遇到了很多问题,万幸,通过自己的思考和师傅们帮忙都解决了。

关于go与websocket编程,github上有很多开源的源码,比如https://github.com/garyburd/go-websocket。我发现,现在网上流传的关于go 的websocket编程基本上都是差不多的类型,当然,websocket也不过如此而已啦。再说说,对如此简单的问题,我碰到的那些麻烦事吧。

1.当服务器启动起来之后,再怎么运行?因为刚开始对websocket的认识都是一知半解的,连程序怎样运行起来都不知道。开始是直接运行html文件,只是静态页面,貌似根本就没有跟服务器进行互动一样。想了想,直接在浏览器中输入ip,竟然好了,这才明白服务器中指定url的意义。

2.因为工作需要,我们的开发都是在虚拟机内进行的,可是虚拟机上不能连外网的。自己觉得还是脱离虚拟机用起来更爽些,所以,不辞劳苦地每天早上早来把环境部署好,就是为了当天可以在外网环境中工作,这是多么大无畏的精神啊,嘿嘿。言归正传,在外网运行好好的程序,迁移到内网的时候却怎样都运行不起来了。这个原因也是很容易找的,因为内网和外网只有一个区别,一个能上外网,一个不能。看了下代码,是有src="http://ajax.googleapis.com/ajax/libs/jQuery/1.4.2/jquery.min.js",所以,这些js资源应该是在网上下载下来的,我把这个库下载下来保存到文件,通过src将资源关联进来,竟然还不行。同样的操作,我在外网又弄了一遍,也是运行部起来。以前学过一些浏览器调试的方法,发现根本就找不到这些源文件,目录都是好好的,怎么就是找不到呢?真是让人郁闷了。把师父叫过来,他说找不到资源,然后把websocket的原理又给我讲了一遍,这些协议什么的以前接触太少了,好多时候不是一下子就能明白过来的。说在浏览器中输入ip时,会从这个目录下去找,当然找不到了。然后说开启nginx什么的,反正我没听懂。既然只能找到这个html文件,我为何不能把这些js文件内容都直接写到html中呢?事实证明,这个想法还是不错的,因为js代码都比较集中,不会影响代码的可读性。

3.关于协议中信息的传输,很重要的一点是,要统一两端的数据格式。我的想法就是拿到原原本本从对端传来的数据,根据自己的需要进行封装。这样两边都是以byte数组进行传递的。可是,server端接收到数据之后,为了验证正确性,我把它转换为字符串打印出来,也奇了怪了,只要是一转换,就只能打印出第一次接收的数据,后面的好像都被丢掉了一样。如果不转换,就可以一条不少地把信息的二进制流打印出来。我把所有会出错的地方都扫了一遍,并不觉得哪里会有问题啊。我又把师父给叫来了。把我的情况描述了下,他给我的建议是,尽量使用websocket包已经封装好的函数,这样一方面性能上有保证,另一方面也可以减少出错的几率。我当时还是很纠结为什么会出现这样的结果,所以即使是将自己的函数替换为函数库中的函数,总不忘去试一下会不会转换时候还是有问题。为了调试方便,把所有的输入到重定向了文件,然后通过文本编辑器看结果。这次,还是同样的结果,这说明我的代码可能不是导致出现问题的源头。我把输出尽量减少,在编译器中直接运行,竟然看到了正确的结果,我确认,出问题的是文本编辑器,真是不靠谱啊,害得我花了一下午的时间来找问题。后来也碰到了类似的问题,所有的输出在文本编辑器中竟然都成了一串串的数字,实用cat打印,内容是正常的。不自己冒出一句话,这开源的真是不靠谱啊。当然,现在不会再那么依赖文本编辑器了,其实已经换了三个了,总会时不时出现恼人的bug。

4.关于代码的组织结构方面,我觉得不太可能的事情都被师父一句话给解决了,真是佩服得我五体投地啊。有些时候,把一些功能封装到一个函数中,再进行调用,可以使代码看起来比较整洁,我就犯了这个毛病,总是想着把那些功能封装起来,直接一调用,很方便。关于将函数嵌入到内部,倒是见过,自己从来都没有用过,现在遇到问题,也不可能想到可以那样解决啊。所以,这也算又是一个经验吧。

5.中文乱码问题。对于学Java的人来说,中文乱码好像是老生常谈的问题,不管你怎么小心翼翼,这个中文乱码总是阴魂不散。以前,每次遇到乱码,就会抱怨自己,怎么就选择了java了呢,这不是没事找事吗?现在好不容易脱离java了,竟然同样遇到了中文乱码。我竟然跟师傅讨价还价,我们可以不支持中文啊,干嘛非要花力气去解决这个问题。他当时脸都绿了,说这个必须有啊。现在想想,自己真是挺搞笑的,怎么这么容易就退缩了呢。使用英文的时候,tcp和websocket互相通信都是好的,唯有在websocket浏览器客户端输入中文时候就乱码了。跟踪了很久,发现从浏览器中发出,到从服务器往外发送都是正确的中文,只有到浏览器接收到数据之后就成了乱码了。我就把问题归结为,js代码中字符编码是不是有问题呢?当时并没有觉得自己的服务器发送端是有问题的,因为即使是websocket间使用程序通信,中文也是没有问题的。找来以前的师父,他再三问我确认服务器端发送时候是正常的吗,开始我说确定,后来被他问蒙了,变成了应该没问题吧。他就开始找前端的问题。说按理说前端代码都是自适应的,不应该调整字符编码,要不然用户体验就差了,谁因为访问个网页还去修改字符集啊。最后得出的结论是,浏览器收到消息时候已经是乱码了。这就不好玩了,这充分说明问题是出在发送端的,那为什么不用浏览器就是好的呢?用原来的demo程序运行,发现中文是可以的,找了下,原来我发送的时候都是把消息转换成了byte数组,其实直接按照string格式的数据传递给函数就可以了。也许函数内部已经将这些数据进行了重新转换了吧。

这几个应该是纠缠我时间最长的问题,通过解决这些问题,自己也学会了很多东西。遇到问题能够静下心来分析了。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯移动品质中心TMQ的专栏

基于 hook 和 gmock 开展单元测试

单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函...

9042
来自专栏小樱的经验随笔

CTF---Web入门第十三题 拐弯抹角

拐弯抹角分值:10 来源: cwk32 难度:易 参与人数:5765人 Get Flag:2089人 答题人数:2143人 解题通过率:97% 如何欺骗服务...

40311
来自专栏java一日一条

怎样编写高质量的Java代码

怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍。也请有过代码...

1671
来自专栏大前端开发

从编程小白到全栈开发:理解异步

作为以JavaScript为主要开发语言的JS全栈开发者,是一定会碰上“异步(Asynchronous)”这个重要概念的,尽早的理解这个概念,会对你的JS编程生...

913
来自专栏Keegan小钢

App架构经验总结(一)

原文链接:http://keeganlee.me/post/architecture/20160303 版权声明:本文刊载在《程序员》杂志2016年3期,版权归...

2344
来自专栏美码师

完美数据迁移-MongoDB Stream的应用

最近微服务架构火的不行,但本质上也只是风口上的一个热点词汇。 作为笔者的经验来说,想要应用一个新的架构需要带来的变革成本是非常高的。

3232
来自专栏精讲JAVA

怎样编写高质量的Java代码

代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍...

45110
来自专栏平凡文摘

怎样编写高质量的Java代码

1713
来自专栏Java技术分享圈

杨老师课堂_Java教程第一篇之认识计算机

*接下来就是确定、确定、确定就ok! *检验环境变量是否成功在DOS命令行里输入javac或java,如果正常显示一些内容,说明安装成功并且配...

1062
来自专栏cloudskyme

linux内存查看方式

如下显示free是显示的当前内存的使用,-m的意思是M字节来显示内容.我们来一起看看. $ free -m total ...

5154

扫码关注云+社区

领取腾讯云代金券