goroutine和channel对tcp连接消息的收发

初级赛亚人 · · 2802 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在看这篇文章之前,如果你没看过golang利用socket封装数据,那我建议你看下;

同样,如果没看过goroutine和channel实现master-worker模式,同样建议你看下并理解之后再来看这篇文章。

这篇文章主要是上两篇文章的结合使用。

tcp消息的收发

我们已经知道,socket是一个抽象层,其本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。所以我们队tcp消息的收发即对socket中几个接口的配合使用来完成。

golang利用socket封装数据这篇文章中,我们对tcp的消息有收发的处理。但是,成千上万个client发送到server端的tcp请求可能server端还能应付得过来(每个tcp连接开启一个goroutine,这是典型的BIO方式处理),要是数量级继续往上呢?结果server端就不一定能应付得过来了,因此考虑不用BIO的方式处理(之后会考虑写一篇文章专门讲一下BIO,NIO,AIO方式),暂时改用master-worker模式来处理tcp连接消息的收发,对于刚看完上两篇文章的你可能已经想到了,将前两篇文章稍作修改,就可以完成这个工作,因此我建议你最好动手试试,代码完成之后运行一遍看看是否成功。





















如果你任然没有头绪,这里或许会给你一点提示,在worker的Job中封装conn,然后将server端的handleConn(conn net.Conn)函数移到worker中,在处理job那里调用handleConn()。由于对这个Job的处理不需要返回结果集,所以你可以尝试取出master和worker中的结果集Result。









如果你已经完成了上面的步骤,多次尝试能否成功运行且在server端正确解析数据,如果都能成功解析数据,那么恭喜你,成功了。


如果你发现在server端不断接受数据,而client端没有接收到server返回的数据,那么也恭喜你,踏入另外一个坑,你可以尝试分析一下server接收到的数据,看看问题出在什么地方,或者从tcp连接出发,想想可能在哪个地方出现问题。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:初级赛亚人

查看原文:goroutine和channel对tcp连接消息的收发

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2802 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传