[Golang] 从零开始写Socket Server(1): Socket-Client框架
版权声明:本文为博主原创文章,未经博主允许不得转载。
第一次跑到互联网公司实习 。。感觉自己进步飞快啊~第一周刚写了个HTTP服务器用于微信公共号的点餐系统~ 第二周就直接开始一边自学Go语言一边写用于Socket的服务器了。。。
因为发现Golang这一块资料挺少的,接下来我会在Blog里把整个Server的Coding,还有遇到的坑都记录下来~
在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可很方便的完成连接等操作~
在这里,给出一个最最基础的基于Socket的Server的写法:
- package main
- import (
- "fmt"
- "net"
- "log"
- "os"
- )
- func main() {
- //建立socket,监听端口
- netListen, err := net.Listen("tcp", "localhost:1024")
- CheckError(err)
- defer netListen.Close()
- Log("Waiting for clients")
- for {
- conn, err := netListen.Accept()
- if err != nil {
- continue
- }
- Log(conn.RemoteAddr().String(), " tcp connect success")
- handleConnection(conn)
- }
- }
- //处理连接
- func handleConnection(conn net.Conn) {
- buffer := make([]byte, 2048)
- for {
- n, err := conn.Read(buffer)
- if err != nil {
- Log(conn.RemoteAddr().String(), " connection error: ", err)
- return
- }
- Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))
- }
- }
- func Log(v ...interface{}) {
- log.Println(v...)
- }
- func CheckError(err error) {
- if err != nil {
- fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
- os.Exit(1)
- }
- }
唔,抛除go语言里面10行代码有5行error的蛋疼之处,你可以看到,Server想要建立并接受一个Socket,其核心流程就是
- netListen, err := net.Listen("tcp", "localhost:1024")
- conn, err := netListen.Accept()
- n, err := conn.Read(buffer)
这三步,通过Listen、Accept 和Read,我们就成功的绑定了一个端口,并能够读取从该端口传来的内容~
Server写好之后,接下来就是Client方面啦,我手写一个HelloWorld给大家:
- package main
- import (
- "fmt"
- "net"
- "os"
- )
- func sender(conn net.Conn) {
- words := "hello world!"
- conn.Write([]byte(words))
- fmt.Println("send over")
- }
- func main() {
- server := "127.0.0.1:1024"
- tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
- os.Exit(1)
- }
- conn, err := net.DialTCP("tcp", nil, tcpAddr)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
- os.Exit(1)
- }
- fmt.Println("connect success")
- sender(conn)
- }
可以看到,Client这里的关键在于
- tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
- 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框架的更多相关文章
- 从零开始写一个武侠冒险游戏-0-开发框架Codea简介
从零开始写一个武侠冒险游戏-0-开发框架Codea简介 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.03 增加对 XCode 项目文件的说明. 概述 本游戏全 ...
- 教你写个简单到的 Redis Client 框架 - .NET Core
目录 1,关于 Redis RESP 定义数据类型 2,定义异步消息状态机 3,定义命令发送模板 4,定义 Redis Client 5,实现简单的 RESP 解析 6,实现命令发送客户端 7,如何使 ...
- 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...
- 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)
从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...
- 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...
- [Golang] 从零開始写Socket Server(2): 自己定义通讯协议
在上一章我们做出来一个最基础的demo后,已经能够初步实现Server和Client之间的信息交流了~ 这一章我会介绍一下怎么在Server和Client之间实现一个简单的通讯协议.从而增强整个信息交 ...
- [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)
通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...
- 在socket的server端处理client端发来的数据
一.楔子 最近做了一个需求遇到一个坑,归结成一个小问题,其实就是在socket的server端处理client端发来的数据的问题,现将这个问题总结一下,本文将数据在server端以字典的形式存储. 另 ...
- C语言写了一个socket server端,适合windows和linux,用GCC编译运行通过
////////////////////////////////////////////////////////////////////////////////* gcc -Wall -o s1 s1 ...
随机推荐
- Table折叠小技巧html-demo
1.要做一个table折叠的展示文本框直接上代码 html: <!DOCTYPE html> <html> <head> <title>table-折叠 ...
- 如何删除Android studio中的注解代码
http://blog.csdn.net/maimiho/article/details/52195081 先看下上面的文章.只是换下正则表达式即可 正则表达式:/\*[\s\S ]*
- 从头開始学 RecyclerView(三) 封装简化
前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...
- 9、java5线程池之定时任务线程池newScheduledThreadPool与newSingleThreadScheduledExecutor
JDK文档描述 newSingleThreadScheduledExecutor() 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行.(注意,如果因为在关闭前的执行期间出现失败而终 ...
- python之docstrinigs
# -*- coding: cp936 -*- #python 27 #xiaodeng #docstrinigs #文档字符串惯例 ''' 1.多行字符串 2.首行以大写字母开始,以句号结束 3.第 ...
- python模块之HTMLParser之穆雪峰的案例(理解其用法原理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...
- Oracle常用存储过程写法
写在前面 这段时间工作最长接触到的就是Oracle数据库,不论查数据,还是统计.运行job,都离不开PL/SQL 存储过程,下面就整理下经常用到的知识. 一.Function函数 函数是执行非查询语句 ...
- (原)lua及torch中的type
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6591641.html 说明:本文不一定正确... 如果要是variable:type(),则返回tor ...
- Java中用HttpsURLConnection访问Https链接
在web应用交互过程中,有很多场景需要保证通信数据的安全:在前面也有好多篇文章介绍了在Web Service调用过程中用WS-Security来保证接口交互过程的安全性,值得注意的是,该种方式基于的传 ...
- MATLAB 在同一个m文件中写多个独立的功能函数
MATLAB 在同一个m文件中写多个独立的功能函数,从而实现在外部可以直接调用这个文件中的某一个函数. 鉴于MATLAB的函数文件的函数名与文件名要一样,就需要有一个统一的接口来涵盖这些功能函数. 例 ...