Golang语言 Socket
时间:2022-05-05
本文章向大家介绍Golang语言 Socket,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. Socket 简介
常用的 Socket 类型有两种:流式 Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。
流式是一种面向连接的 Socket,针对于面向连接的 TCP 服务应用;
数据报式 Socket 是一种无连接的 Socket,对应于无连接的 UDP 服务应用
2. 网络中的进程之间如何通过 Socket 通信呢?
网络层的“ip 地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用 三元组(ip 地址,协议,端口)就可以标识网络的进程了,网络中需要互相通信的进程,就可以利用这个标志在他们之间进行交互。
3. 代码示例:客户端模拟HTTP 协议
package main
2
3 import (
4 "fmt"
5 "io/ioutil"
6 "net"
7 "os"
8 )
9
10 func main() {
11 service := "www.baidu.com:80"
12 // tcpAddr, 将域名+端口,解析成 ip+端口
13 tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
14 fmt.Println(tcpAddr)
15 checkError(err)
16 conn, err := net.DialTCP("tcp", nil, tcpAddr)
17 checkError(err)
18 _, err = conn.Write([]byte("HEAD / HTTP/1.0rnrn"))
19 checkError(err)
20 result, err := ioutil.ReadAll(conn)
21 checkError(err)
22 fmt.Println(string(result))
23 }
24
25 func checkError(err error) {
26 if err != nil {
27 fmt.Fprintf(os.Stderr, "Fatal error:%s", err.Error())
28 }
29 }
4. 代码示例:TCP,客户端与服务器交互
/server/main.go
1 package main
2
3 import (
4 "fmt"
5 "net"
6 "os"
7 "time"
8 )
9
10 func main() {
11 listener, err := net.Listen("tcp", "localhost:2300")
12 checkError(err)
13 fmt.Println("Service Starting...")
14 defer listener.Close()
15 for {
16 conn, err := listener.Accept()
17 fmt.Println("已连接:", conn.LocalAddr())
18 if err != nil {
19 continue
20 }
21 go handleClient(conn)
22 }
23 }
24
25 func checkError(err error) {
26 if err != nil {
27 fmt.Fprintf(os.Stderr, "Fatal error:%s", err.Error())
28 }
29 }
30
31 func handleClient(conn net.Conn) {
32 defer conn.Close()
33 daytime := time.Now().String()
34 conn.Write([]byte(daytime))
35
36 }
/client/main.go
1 package main
2
3 import (
4 "fmt"
5 "net"
6 "os"
7 )
8
9 func main() {
10 conn, err := net.Dial("tcp", "localhost:2300")
11 checkError(err)
12 bt := make([]byte, 1024)
13 _, err = conn.Read(bt)
14 fmt.Println(string(bt))
15 defer conn.Close()
16 }
17
18 func checkError(err error) {
19 if err != nil {
20 fmt.Fprintf(os.Stderr, "Fatal error:%s", err.Error())
21 }
22 }
5. 代码示例:UDP,客户端与服务器交互
/server/main.go
1 package main
2
3 import (
4 "fmt"
5 "net"
6 "os"
7 "time"
8 )
9
10 func main() {
11 service := "localhost:1200"
12 udpAddr, err := net.ResolveUDPAddr("udp", service)
13 conn, err := net.ListenUDP("udp", udpAddr)
14 checkError(err)
15 fmt.Println("Starting...")
16 for {
17 handleClient(conn)
18 }
19 }
20
21 func checkError(err error) {
22 if err != nil {
23 fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())
24 os.Exit(1)
25 }
26 }
27
28 func handleClient(conn *net.UDPConn) {
29 fmt.Println("接收到请求了,开始处理")
30 var buf [512]byte
31 _, addr, err := conn.ReadFromUDP(buf[0:])
32 if err != nil {
33 return
34 }
35 fmt.Println(string(buf[0:]))
36 daytime := time.Now().String()
37 conn.WriteToUDP([]byte(daytime), addr)
38 }
/client/main.go
1 package main
2
3 import (
4 "fmt"
5 "net"
6 "os"
7 )
8
9 func main() {
10 service := "localhost:1200"
11 udpAddr, err := net.ResolveUDPAddr("udp", service)
12 checkError(err)
13 conn, err := net.DialUDP("udp", nil, udpAddr)
14 checkError(err)
15 conn.Write([]byte("hello world"))
16 var bt [512]byte
17 conn.ReadFromUDP(bt[0:])
18 fmt.Println(string(bt[0:]))
19 defer conn.Close()
20 }
21
22 func checkError(err error) {
23 if err != nil {
24 fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())
25 os.Exit(1)
26 }
27 }
- ASP.NET MVC下的异步Action的定义和执行原理
- 包学会之浅入浅出Vue.js:结业篇
- 迈克尔•戴尔:人工智能杀手?技术反乌托邦?不存在的
- 你知道吗?多个类多线程环境下静态构造函数的执行顺序
- 云端架构师养成之三:微信也在用的消息队列服务
- 现在 tensorflow和mxnet 很火,是否还有必要学习 scikit-learn 等框架?
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- 改进版CodeTimer及XCode性能测试
- 常见测试术语解析
- 秦俊:开放 DevOps 敏捷开发套件,助力开发者驰骋云端
- 开源组件NanUI一周年-使用HTML/CSS/JS来构建.Net Winform应用程序界面
- 邱寒:新零售笔记(四)基于区块链大数据的人工智能
- 腾讯云GAME-TECH沙龙干货回顾:网龙《英魂之刃口袋版》开发经验分享
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 博客整体风格更改
- centos6.6下安装MongoDB3.x
- Goland 中配置 go-lint 代码检查
- JetBrains注册码计算(IntelliJ IDEA 15.0注册码激活)
- Java文本框内文字显示不同颜色、字号等属性【函数调用一键实现】
- PLSQL-sql操作&判断循环
- Python 技术篇-用PIL库实现彩色图片转化为黑白图片
- PLSQL-游标
- 超详细的Java容器、面板及四大布局管理器应用讲解!
- Go各时间字符串的解析
- MongoDB数据分页与排序
- Python 技术篇-用PIL库实现图片剪切、图片粘贴
- maven初步入门
- 超详细的Java弹窗样式及使用教程【JOptionPane类详细使用教程】
- Python 技术篇-用PIL库旋转图片的两种方式,改变图像尺寸