net/http包,http底层就是用tcp socket实现的

--------------------------------------------------------------------------------------

转自:https://www.cnblogs.com/chevin/p/8082224.html

原创:PCWen's blog(https://www.cnblogs.com/chevin/)

仅做个人备份,浏览请看原文

1.本例子实现了一个简单的TCP echo。客户端发送Hello,服务端回应World。

参考:《Socket编程》:https://github.com/gagayuan/runoob-PDF-

2.服务端代码

package mainimport ("net""fmt""os""time"
)//错误处理函数
func checkErr(err error, extra string) bool {if err != nil {formatStr := " Err : %s\n";if extra != "" {formatStr = extra + formatStr;}fmt.Fprintf(os.Stderr, formatStr, err.Error());return true;}return false;
}//连接处理函数
func svrConnHandler(conn net.Conn) {fmt.Println("Client connect success :", conn.RemoteAddr().String());conn.SetReadDeadline(time.Now().Add(2 * time.Minute))request := make([]byte, 128);defer conn.Close();for {readLen, err := conn.Read(request)if checkErr(err, "Read") {break;}//socket被关闭了if readLen == 0 {fmt.Println("Client connection close!");break;} else {//输出接收到的信息fmt.Println(string(request[:readLen]))time.Sleep(time.Second);//发送conn.Write([]byte("World !"));}request = make([]byte, 128);}
}func main() {//解析地址tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:6666");if checkErr(err, "ResolveTCPAddr") {return;}//设置监听地址listener, err := net.ListenTCP("tcp", tcpAddr);if checkErr(err, "ListenTCP") {return;}for {//监听fmt.Println("Start wait for client.")conn, err := listener.Accept();if checkErr(err, "Accept") {continue;}//消息处理函数go svrConnHandler(conn);}
}

3.客户端代码

package mainimport ("fmt""os""net""sync"
)var gLocker sync.Mutex; //全局锁
var gCondition *sync.Cond; //全局条件变量//错误处理函数
func checkErr(err error, extra string) bool {if err != nil {formatStr := " Err : %s\n";if extra != "" {formatStr = extra + formatStr;}fmt.Fprintf(os.Stderr, formatStr, err.Error());return true;}return false;
}//连接处理函数
func clientConnHandler(conn net.Conn) {gLocker.Lock();defer gLocker.Unlock();defer conn.Close();request := make([]byte, 128);for {readLen, err := conn.Read(request)if checkErr(err, "Read") {gCondition.Signal();break;}//socket被关闭了if readLen == 0 {fmt.Println("Server connection close!");//条件变量同步通知gCondition.Signal();break;} else {//输出接收到的信息fmt.Println(string(request[:readLen]))//发送conn.Write([]byte("Hello !"));}request = make([]byte, 128);}
}func main() {//解析地址tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:6666");if checkErr(err, "ResolveTCPAddr") {return;}conn, err := net.DialTCP("tcp", nil, tcpAddr);if checkErr(err, "DialTCP") {return;}fmt.Println("Connect server success.")gLocker.Lock();gCondition = sync.NewCond(&gLocker);//发送数据给服务器conn.Write([]byte("Hello !"));//处理连接(lock在上面调用了,所以clientConnHandler函数必须等wait函数调用后才能lock,这样就能保证调用的先后顺序)go clientConnHandler(conn);//主线程阻塞,等待Singal结束for {//条件变量同步等待gCondition.Wait();break;}gLocker.Unlock();fmt.Println("Client finish.")
}

PS:关于sync.Cond可以参考下一篇文章:《Golang sync》

4.结果截图

以上。

golang socket 例相关推荐

  1. golang socket读写同时_epoll在Golang的应用

    使用Golang可以轻松地为每一个TCP连接创建一个协程去服务而不用担心性能问题,这是因为Go内部使用goroutine结合IO多路复用实现了一个"异步"的IO模型,这使得开发者不 ...

  2. Golang websocket

    2019独角兽企业重金招聘Python工程师标准>>> 环境:Win10 + Go1.9.2 1.先下载并引用golang的websocket库 ①golang的官方库都在https ...

  3. 关于Go语言在服务端做Restful接口和socket通信

    转载自: http://xiaorui.cc/2014/10/25/%e5%85%b3%e4%ba%8ego%e8%af%ad%e8%a8%80%e5%9c%a8%e6%9c%8d%e5%8a%a1% ...

  4. Golang笔记——tcp 编程

    看两个实际应用 QQ,迅雷,百度网盘客户端. 新浪网站,京东商城,淘宝. 网络编程基本介绍 Golang 的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少 也是至关重要 ...

  5. Golang 主机字节序的判断

    字节序按类别分两种,一种是小端(Little Endian),另一种是大端(Big Endian). (1)小端字节序,指一个单元在计算机中存放时按照低位在低地址,高位在高地址的模式存放: (2)大端 ...

  6. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  7. 一文说尽Golang单元测试实战的那些事儿

    导语 | 单元测试,通常是单独测试一个方法.类或函数,让开发者确信自己的代码在按预期运行,为确保代码可以测试且测试易于维护.腾讯后台开发工程师张力结合了公司级漏洞扫描系统洞犀在DevOps上探索的经验 ...

  8. Socket 编程原理

    目录 socket编程 基本概念 编程流程 socket函数 协议 TCP UDP DNS HTTP HTTPS socket编程 基本概念 socket编程即计算机网络编程,目的是使两台主机能够进行 ...

  9. golang设计模式介绍(内含各个模式的java对比)代码解读

    golang设计模式介绍 设计模式是面向对象软件的经验,是通常设计问题的解决方案,每一种设计模式系统的命名,解释和评价了面向对象中一个重要的和重复出现的设计. 以下一一介绍这些设计模式 1.1工厂设计 ...

  10. 造轮子 Websocket 现在就 Go

    造轮子 Websocket 现在就 Go MD: 2019‎年‎12‎月17‎日,‏‎03:45:10 笔者坚果有幸从事软件开发,一直都是兴趣驱动的工作.第一次接触计算机是 1999 年后的事,我用来 ...

最新文章

  1. java-多线程 String 常量池缓存功能带来的问题
  2. 在Java中使用Socket模拟客户端和服务端(多线程)
  3. 《2020总结-2021展望》
  4. java php python 高并发_关于php如何调用Python快速发送高并发邮件的示例代码
  5. Apache java文件比对,Java Apache Commons的字符串比较
  6. Redis系列-主从复制配置
  7. 在工作中常用的sql语句
  8. 集总参数电路的判定——电源波长λ和元件尺寸L的比较
  9. 《Spring微服务实战》读书笔记——通过配置服务器来管理配置
  10. 实验一: 网络侦查与网络扫描
  11. 宏基ACER Aspire R3600 REVO离子平台
  12. 【路径规划】基于matlab粒子群和遗传算法求解机器人栅格地图避障路径规划问题【含Matlab源码 202期】
  13. 写代码有这16个好习惯,可以减少80%非业务的bug
  14. 系统崩溃,TCP协议栈
  15. 【操作系统概论】~知识点总结
  16. 温度补偿 matlab,基于传感器温度补偿方法的双指数函数模型的温度补偿算法设计...
  17. 推荐系统遇上深度学习(三十六)--Learning and Transferring IDs Representation in E-commerce...
  18. Javascript动态创建SVG圆弧
  19. 对 BFC 规范(块级格式化上下文:block formatting context)的理解?
  20. HTML期末作业~个人信息展示网站响应式模板(HTML+CSS+JavaScript)

热门文章

  1. vi命令下编辑文件时,按insert键文件底部无法编辑
  2. Linux Postfix
  3. 预制包含很多lib库的apk
  4. 九宫格摆法_九宫格婚纱照摆法图片与技巧
  5. PTA不变初心数(17分)简单答案版
  6. Apache Kafka-auto.offset.reset参数(earliest、latest、none)含义说明
  7. 精进1-如何反思 by采铜
  8. 家用无线路由器的设置
  9. Spring Cloud Loadbalancer
  10. 程序集版本号,文件版本号及发布版本号管理