版权声明:本文为博主原创文章,未经博主允许不得转载。

第一次跑到互联网公司实习 。。感觉自己进步飞快啊~第一周刚写了个HTTP服务器用于微信公共号的点餐系统~ 第二周就直接开始一边自学Go语言一边写用于Socket的服务器了。。。

因为发现Golang这一块资料挺少的,接下来我会在Blog里把整个Server的Coding,还有遇到的坑都记录下来~

在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可很方便的完成连接等操作~

在这里,给出一个最最基础的基于Socket的Server的写法:

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "log"
  6. "os"
  7. )
  8. func main() {
  9. //建立socket,监听端口
  10. netListen, err := net.Listen("tcp", "localhost:1024")
  11. CheckError(err)
  12. defer netListen.Close()
  13. Log("Waiting for clients")
  14. for {
  15. conn, err := netListen.Accept()
  16. if err != nil {
  17. continue
  18. }
  19. Log(conn.RemoteAddr().String(), " tcp connect success")
  20. handleConnection(conn)
  21. }
  22. }
  23. //处理连接
  24. func handleConnection(conn net.Conn) {
  25. buffer := make([]byte, 2048)
  26. for {
  27. n, err := conn.Read(buffer)
  28. if err != nil {
  29. Log(conn.RemoteAddr().String(), " connection error: ", err)
  30. return
  31. }
  32. Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))
  33. }
  34. }
  35. func Log(v ...interface{}) {
  36. log.Println(v...)
  37. }
  38. func CheckError(err error) {
  39. if err != nil {
  40. fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  41. os.Exit(1)
  42. }
  43. }

唔,抛除go语言里面10行代码有5行error的蛋疼之处,你可以看到,Server想要建立并接受一个Socket,其核心流程就是

  1. netListen, err := net.Listen("tcp", "localhost:1024")
  1. conn, err := netListen.Accept()
  1. n, err := conn.Read(buffer)

这三步,通过Listen、Accept 和Read,我们就成功的绑定了一个端口,并能够读取从该端口传来的内容~

Server写好之后,接下来就是Client方面啦,我手写一个HelloWorld给大家:

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. )
  7. func sender(conn net.Conn) {
  8. words := "hello world!"
  9. conn.Write([]byte(words))
  10. fmt.Println("send over")
  11. }
  12. func main() {
  13. server := "127.0.0.1:1024"
  14. tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
  15. if err != nil {
  16. fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  17. os.Exit(1)
  18. }
  19. conn, err := net.DialTCP("tcp", nil, tcpAddr)
  20. if err != nil {
  21. fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  22. os.Exit(1)
  23. }
  24. fmt.Println("connect success")
  25. sender(conn)
  26. }

可以看到,Client这里的关键在于

  1. tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
  1. conn, err := net.DialTCP("tcp", nil, tcpAddr)

这两步,主要是负责解析端口和连接~

写好Server和Client之后,让我们运行一下看看:~~

成功运行,Console出现Server等待连接的提示:

然后我们运行Client:

成功连接Server啦,让我们看看Server那边的成果:

Server端成功的收到了我们的Hello-World啦,至于后面的那行红字,则是断开连接的提示~

到这里,一个最基础的使用Socket的Server-Client框架就出来啦~

如果想要让Server能够响应来自不同Client的请求,我们只要在Server端的代码的main入口中,

在 handleConnection(conn net.Conn) 这句代码的前面加上一个 go,就可以让服务器并发处理不同的Client发来的请求啦

关于Golang的并发处理,可以参考这里 Golang并行计算

下一篇,我会写一下如何在Server和Client中设计一个通讯协议,从而达到自己的一些特殊要求~

[Golang] 从零开始写Socket Server(1): Socket-Client框架的更多相关文章

  1. 从零开始写一个武侠冒险游戏-0-开发框架Codea简介

    从零开始写一个武侠冒险游戏-0-开发框架Codea简介 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.03 增加对 XCode 项目文件的说明. 概述 本游戏全 ...

  2. 教你写个简单到的 Redis Client 框架 - .NET Core

    目录 1,关于 Redis RESP 定义数据类型 2,定义异步消息状态机 3,定义命令发送模板 4,定义 Redis Client 5,实现简单的 RESP 解析 6,实现命令发送客户端 7,如何使 ...

  3. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  4. 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)

    从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...

  5. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  6. [Golang] 从零開始写Socket Server(2): 自己定义通讯协议

    在上一章我们做出来一个最基础的demo后,已经能够初步实现Server和Client之间的信息交流了~ 这一章我会介绍一下怎么在Server和Client之间实现一个简单的通讯协议.从而增强整个信息交 ...

  7. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  8. 在socket的server端处理client端发来的数据

    一.楔子 最近做了一个需求遇到一个坑,归结成一个小问题,其实就是在socket的server端处理client端发来的数据的问题,现将这个问题总结一下,本文将数据在server端以字典的形式存储. 另 ...

  9. C语言写了一个socket server端,适合windows和linux,用GCC编译运行通过

    ////////////////////////////////////////////////////////////////////////////////* gcc -Wall -o s1 s1 ...

随机推荐

  1. jconsole监控远程linux tomcat运行情况的配置 (转)

    来自:http://zhumeng8337797.blog.163.com/blog/static/100768914201242494649455/ 步骤如下: 1.编辑tomcat/bin/cat ...

  2. 2016 博客导读总结 & 个人感悟

    此文着笔之时.2017已经在眼前了.预计等我写完,2017已经到了. 二次编辑于2017年1月1日早11点. 关于2016的感悟.十二月初就想写,当时认为是有点太早了,只是却思绪如泉涌. 且那时候才刚 ...

  3. 批量 ping 测试脚本(IP 扫描)

    是否会使用 vpn 工作,已经成为魔法师和麻瓜之间最重要的区分.使用 vpn 工作,也产生了其它一些奇奇怪怪的问题,比如,选择 vpn 服务器. 你要测试哪个 vpn 离你最近. 所以,就有了下面的脚 ...

  4. exception java.lang.OutOfMemoryError: Java heap space

      1.情景展示 java内存溢出异常,将程序代码问题排除在外,如何增大JVM的使用内存? 2.解决方案  在eclipse中的解决办法:增大你要运行的测试类的内存分配. 点击运行或debug按钮旁的 ...

  5. data1是字符串?需要加上引号

    07-22 15:55:29.832: E/AndroidRuntime(23914): FATAL EXCEPTION: main 07-22 15:55:29.832: E/AndroidRunt ...

  6. ios中项目

    上一个版本 http://pan.baidu.com/share/link?shareid=2183244558&uk=923776187 下载地址  http://pan.baidu.com ...

  7. xshell连接centos vi编辑器不能使用小键盘

    莫名其妙的本人的xshell,在vim编辑脚本的时候,右侧小键盘无法输出数字,输出的都是一些字母,而且还是一个字母占一行,太过艹蛋! 后来就按照正规的操作步骤,又重建了连接,居然发现正常了! 百思一虑 ...

  8. Java交替打印两个字符串

    一.使用volatile关键字 public class Main { volatile int x = 0; Main() { new Thread(() -> { while (x < ...

  9. java struts2入门学习---异常处理和类型转换

    一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...

  10. Nginx官方版本说明##Mainline &Stable&Legacy versions

    Nginx (Mainline Stable Legacy)区别 Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发 ...