go语言中的socket和http

Go 基础语法3(Socket、httpserver) 本篇概要:10. Socket 服务端和客户端;10.1 创建简单 Socket 服务端和客户端代码;10.2 "死循环"Socket服务端、支持浏览器输出;10.3 正则入门、分析请求path、Socket服务端开启协程支持;10.4 实现浏览器静态文件的访问、处理 404;11. httpserver;11.1 使用http包快速创建server、自定义handler;11.2 路由、设置cookie、注销、判断登录;11.3 自定义路由、支持 GET / POST 访问;11.4 创建自己的简易"上下 阅读详情

Socket 编程

以前我们使用Socket编程时,会按照如下步骤展开。
(1) 建立Socket:使用socket()函数。
(2) 绑定Socket:使用bind()函数。
(3) 监听:使用listen()函数。或者连接:使用connect()函数。
(4) 接受连接:使用accept()函数。
(5) 接收:使用receive()函数。或者发送:使用send()函数。
Go语言标准库对此过程进行了抽象和封装。无论我们期望使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可。

Dial()函数

Dial()函数的原型如下:

func Dial(net, addr string) (Conn, error) 

其中net参数是网络协议的名字,addr参数是IP地址或域名,而端口号以“:”的形式跟随在地址或域名的后面,端口号可选。如果连接成功,返回连接对象,否则返回error。

TCP链接:
conn, err := net.Dial(“tcp”, “192.168.0.10:2100”)
UDP链接:
conn, err := net.Dial(“udp”, “192.168.0.12:975”)
ICMP链接:
conn, err := net.Dial(“ip4:icmp”, “www.baidu.com”)
ICMP链接:
conn, err := net.Dial(“ip4:1”, “10.0.0.3”)
链接查看协议编号的含义:http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml。
目前,Dial()函数支持如下几种网络协议:“tcp”、“tcp4”(仅限IPv4)、“tcp6”(仅限IPv6)、“udp”、“udp4”(仅限IPv4)、“udp6”(仅限IPv6)、“ip”、“ip4”(仅限IPv4)和"ip6"
(仅限IPv6)。

在成功建立连接后,我们就可以进行数据的发送和接收。发送数据时,使用conn的Write()成员方法,接收数据时使用Read()方法。

ICMP示例程序

下面我们实现这样一个例子:我们使用ICMP协议向在线的主机发送一个问候,并等待主机返回。

package main 
import ( 
 "net" 
 "os" 
 "bytes" 
 "fmt" 
) 
func main() { 
 if len(os.Args) != 2 { 
 fmt.Println("Usage: ", os.Args[0], "host") 
 os.Exit(1) 
 } 
 service := os.Args[1] 
 conn, err := net.Dial("ip4:icmp", service) 
 checkError(err) 
 var msg [512]byte
 msg[0] = 8 // echo 
 msg[1] = 0 // code 0 
 msg[2] = 0 // checksum 
 msg[3] = 0 // checksum 
 msg[4] = 0 // identifier[0] 
 msg[5] = 13 //identifier[1] 
 msg[6] = 0 // sequence[0] 
 msg[7] = 37 // sequence[1] 
 len := 8 
 check := checkSum(msg[0:len]) 
 msg[2] = byte(check >> 8) 
 msg[3] = byte(check & 255) 
 _, err = conn.Write(msg[0:len]) 
 checkError(err) 
 _, err = conn.Read(msg[0:]) 
 checkError(err) 
 fmt.Println("Got response") 
 if msg[5] == 13 { 
 fmt.Println("Identifier matches") 
 } 
 if msg[7] == 37 { 
 fmt.Println("Sequence matches") 
 } 
 os.Exit(0) 
} 
func checkSum(msg []byte) uint16 { 
 sum := 0 
 // 先假设为偶数
for n := 1; n <len(msg)-1; n += 2 { 
 sum += int(msg[n])*256 + int(msg[n+1]) 
 } 
 sum = (sum >> 16) + (sum & 0xffff) 
 sum += (sum >> 16) 
var answer uint16 = uint16(^sum) 
return answer 
} 
func checkError(err error) { 
if err != nil { 
 fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) 
 os.Exit(1) 
 } 
} 
func readFully(conn net.Conn) ([]byte, error) { 
 defer conn.Close() 
 result := bytes.NewBuffer(nil) 
 var buf [512]byte
for { 
 n, err := conn.Read(buf[0:]) 
 result.Write(buf[0:n]) 
 if err != nil { 
 if err == io.EOF { 
 break 
 } 
 return nil, err 
 } 
 } 
return result.Bytes(), nil
} 

执行结果如下:
$ go build icmptest.go
$ ./icmptest www.baidu.com
Got response
Identifier matches
Sequence matches

TCP示例程序

下面我们建立TCP链接来实现初步的HTTP协议,通过向网络主机发送HTTP Head请求,读取网络主机返回的信息

package main 
import ( 
 "net" 
 "os" 
 "bytes" 
 "fmt" 
) 
func main() { 
if len(os.Args) != 2 { 
 fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0]) 
 os.Exit(1) 
 } 
 service := os.Args[1] 
 
 conn, err := net.Dial("tcp", service) 
 checkError(err) 
 _, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n")) 
 checkError(err) 
 result, err := readFully(conn) 
 checkError(err) 
 fmt.Println(string(result)) 
 os.Exit(0) 
} 
func checkError(err error) { 
if err != nil { 
 fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) 
 os.Exit(1) 
 } 
} 
func readFully(conn net.Conn) ([]byte, error) { 
 defer conn.Close() 
 result := bytes.NewBuffer(nil) 
var buf [512]byte
for { 
 n, err := conn.Read(buf[0:]) 
 result.Write(buf[0:n]) 
 if err != nil { 
 if err == io.EOF { 
 break 
 } 
 return nil, err 
 } 
 } 
 return result.Bytes(), nil
} 

执行这段程序并查看执行结果:
$ go build simplehttp.go
$ ./simplehttp qbox.me:80
HTTP/1.1 301 Moved Permanently
Server: nginx/1.0.14
Date: Mon, 21 May 2012 03:15:08 GMT
Content-Type: text/html
Content-Length: 184
Connection: close
Location: https://qbox.me/

HTTP 编程

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,定义了客户端和服务端之间请求与响应的传输标准。
Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序。

HTTP客户端

Go内置的net/http包提供了最简洁的HTTP客户端实现,

基本方法

net/http包的Client类型提供了如下几个方法,让我们可以用最简洁的方式实现 HTTP 请求:

func (c *Client) Get(url string) (r *Response, err error) 
func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err error) 
func (c *Client) PostForm(url string, data url.Values) (r *Response, err error) 
func (c *Client) Head(url string) (r *Response, err error) 
func (c *Client) Do(req *Request) (resp *Response, err error) 

http.Get()
要请求一个资源,只需调用http.Get()方法(等价于http.DefaultClient.Get())即可,示例代码如下:

resp, err := http.Get("http://example.com/") 
if err != nil { 
 // 处理错误 ... 
 return
} 
defer resp.Body.close() 
io.Copy(os.Stdout, resp.Body) 

http.Post()
要以POST的方式发送数据,也很简单,只需调用http.Post()方法并依次传递下面的3个参数即可:
 请求的目标 URL
 将要 POST 数据的资源类型(MIMEType)
 数据的比特流([]byte形式)
下面的示例代码演示了如何上传一张图片:

resp, err := http.Post("http://example.com/upload", "image/jpeg", &imageDataBuf) 
if err != nil { 
 // 处理错误 
 return
} 
if resp.StatusCode != http.StatusOK { 
 // 处理错误
 return
} 

http.PostForm()
http.PostForm()方法实现了标准编码格式为application/x-www-form-urlencoded的表单提交。下面的示例代码模拟HTML表单提交一篇新文章:

resp, err := http.PostForm("http://example.com/posts", url.Values{"title": 
 {"article title"}, "content": {"article body"}}) 
if err != nil { 
 // 处理错误
 return
} 

 **http.Head() **
HTTP 中的 Head 请求方式表明只请求目标 URL 的头部信息,即 HTTP Header 而不返回 HTTP Body。Go 内置的 net/http 包同样也提供了 http.Head() 方法,该方法同 http.Get() 方法一样,只需传入目标 URL 一个参数即可。下面的示例代码请求一个网站首页的 HTTP Header信息:

resp, err := http.Head("http://example.com/") 

 *(http.Client).Do()
在多数情况下,http.Get()和http.PostForm() 就可以满足需求,但是如果我们发起的HTTP 请求需要更多的定制信息,我们希望设定一些自定义的 Http Header 字段,比如:
 设定自定义的"User-Agent",而不是默认的 “Go http package”
 传递 Cookie
此时可以使用net/http包http.Client对象的Do()方法来实现:

req, err := http.NewRequest("GET", "http://example.com", nil) 
// ... 
req.Header.Add("User-Agent", "Gobook Custom User-Agent") 
// ... 
client := &http.Client{ //... } 
resp, err := client.Do(req) 
// ... 
golang中基于http 和unix socket的通信代码实现(服务端基于gin框架) 目录一、问题背景二、什么是unix socket三、原生的unix socket通信方式四、http+unix socket通信,服务端基于gin框架五、demo的实现移步到项目中六、结论七、后续工作 一、问题背景 实习所在公司的A、B两个应用部署在同一台机器上,之前是采用http://127.0.0.1:xxx进行调用,协议选用tcp。而对于同一台机器的进程间通信来说,tcp协议为了确保传输的可靠性带来了一些不必要的负担,因此计划用unix domain socket“取代”tcp。此外采用此种方式也方便 阅读详情

相关推荐

go语言实现同时启动本地 HTTP 服务和socket隧道

【代码】go语言实现同时启动本地 HTTP 服务和socket隧道。

我不是码农的博客~~~ 51

Go网络编程 Conn接口

Conn接口类型 Conn是一种通用的面向流的网络连接,多个Goroutine可以同时调用Conn上的方法。 主要通过Read(b []byte)读取数据,Write(b [byte]) 写数据 及Close() 关闭连接。 其源码定义在net.go中 type Conn interface { Read(b []byte) (n int, err err...

qq_40417296的博客 7037

Golang网络

跨域请求(Cross-Origin Request)是指浏览器在向一个源(域名、协议、端口号组合)发送请求时,请求的目标资源所在的域名与当前页面所在的域名不一致,即跨域请求。通常情况下,浏览器会限制跨域请求,以保障用户安全。例如,假设当前页面的地址是,而要请求的资源地址是,由于域名不同,这就是一个跨域请求。跨域请求通常会受到浏览器的限制,但可以通过设置响应头中的字段来支持跨域请求。在服务端设置允许跨域请求的响应头后,浏览器就可以发送跨域请求并获取响应了。

605

用Golang构建gRPC服务

本文转载自用Golang构建gRPC服务

ccf19881030的专栏 707

别再手动跑定时任务了!Spring Boot项目5分钟集成xxl-job保姆级教程(含Docker部署调度中心)

本文提供Spring Boot项目快速集成xxl-job的保姆级教程,包括Docker部署调度中心的详细步骤。通过实战案例展示如何构建企业级分布式任务调度系统,解决传统定时任务的资源竞争、单点故障等问题,提升开发效率与系统可靠性。

weixin_30315905的博客 292

深度学习CV八股文

深度学习CV八股文一、深度学习中解决过拟合方法L1和L2正则化DropoutDropout正则化Inverted Dropout(反向随机失活)Dropout起到正则化效果的原因:Dropout的缺点eargstopping ( 早停法 )二、深度学习中解决欠拟合方法三、梯度消失和梯度爆炸解决梯度消失的方法解决梯度爆炸的方法四、神经网络权重初始化方法Xavier指数加权移动平均数五、梯度下降法梯度下降SGD(随机梯度下降法)Momentum(动量梯度下降)Nesterov Momentum自适应学习率算法A

填坑 2万+

go tcp客户端自动重连_go语言网络编程socket sever的实现

首先说一下socket,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket(百度百科)。图片来源于网络其本质就是就是编程接口(API),对TCP、UDP的封装。使用时我们可以指定使用的协议,今天主要使用TCP,目前我们大多数使用的还是TCP,虽然速度没有UDP快,但是更安全,如果有能力的同学,可以使用UDP同时在上层能够检测到传输数据是否有丢失,这个不是很简单...

weixin_39809140的博客 442

【血汗泪心路历程】怎么彻底删掉Sangfor文件?怎么彻底删除easyconnect?删除sangfor后网络坏了、某些app无法正常启动怎么解决?

教程来源于网络的五湖四海+gpt解答。用到了好几个教程和方法,遂这篇总结一下。会标明出处!先上一下战绩:终于把sangfor扔进回收站里了!!!哈哈哈那一刻真的好爽。

weixin_71246590的博客 6万+

go语言零碎笔记

1.net拨号时,如果服务端没打开,返回的net.Conn对象为空 t, _ := net.Dial("tcp", "127.0.0.1:12345") fmt.Println(t==nil) fmt.Printf("关闭前:%v", t) t.Close() fmt.Printf("关闭后:%v", t) time.Sleep(time.Second * 5) fmt.Printf("关闭后,休眠5s:%v", t) 当服务端:127.0.0.1:12345没打开时,打印如下: 可以看到t==nil为

lishuangquan1987的博客 340

K型热电偶分度表读取方法

K型热电偶分度表读取方法

guaizaiguaizai的博客 5924

Quartus ||———基于Verilog HDL的数字秒表设计实验

Quartus ||———基于Verilog HDL的数字秒表设计实验一、实验目的二、实验步骤(一)新建工程(二)添加设计文件(三)综合分析与功能仿真1、综合分析2、功能仿真 一、实验目的 用Verilog HDL设计一个数字跑表,所需引脚和功能如下: 二、实验步骤 (一)新建工程 在创建好工程名称后,选定芯片类型 (二)添加设计文件 新建Verilog文件,键入代码如下 module n_clk_top( input clk, input rese

TBMmagic的博客 5529

socket客户端怎么判断http响应数据的结束

前言 原文地址:https://blog.csdn.net/nimasike/article/details/81122784 http连接   短连接     定义:http头不包含Connection: Keep-Alive     socket读取数据值返回-1者标记为结束   长连接     定义:http头包含Connection: Keep-Alive htt...

weixin_30237719的博客 1244

DA14531-外设驱动篇-UART收发通信应用

宏定义注解CFG_PRINTF用户开启串口串口打印宏设置波特率选择115200。

hejinwu1314的博客 731

Go语言从入门到精通八——socket和http编程

golang中的socket编程 关于socket的基础知识,这里就不介绍了,可以参考python socket编程。 golang创建socket很简单,服务端处理流程通常为: 监听端口 接受客户端的连接请求 创建goroutine,处理该请求 示例代码如下: package main import ( &quot;fmt&quot; &quot;net&quot; ) func main() { //...

Dev-L的博客 824

2024年下半年网络规划设计师论文真题

3、深入论述自身参与的工业网络是如何实施的,为实现制造业的智能化,如何实现数据的跨系统互通,促进各种工业数据的充分流动和无缝集成以及数据安全。3、结合自身参与的网络建设,详细叙述针对该网络“去NAT”的规划和设计方案。4、在实施过程中遇到的问题以及如何处理,项目实施后的效果和评价。2、大型园区网络“去NAT”改造和业务融合的整体架构。1、“网络去NAT”对推进ipv6演进和应用的意义。4、改造过程中遇到的问题及解决方案。2、简要叙述自身参与的制造网络建设。1、网络规划在智能制造中的意义。

鹿鸣天涯 2372

8、音频运行时系统的架构设计

本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。

juice的博客 463

Go语言(十六)网络编程/Socket、http

Go语言网络编程/Socket、http GO语言和网络编程有关的包都在net包下,通过net包及其子包,可以实现各种协议编程、Socket编程、http编程、rpc编程等。 一、Socket编程 1、Dial函数 Go语言中 Dial() 函数用于创建网络连接,函数原型如下: func Dial(network, address string) (Conn, error) { ...

cgl_dong的博客 485

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

go语言微服务项目,基础篇--go3-socket-http

一、网络分层 二、socket - Server Demo 接收一个链接,而且只能发送一次数据 package main import ( "fmt" "net" "strings" ) func main() { //创建监听 ip := "127.0.0.1" port := 8848 address := fmt.Sprintf("%s:%d", ip, port) //func Listen(network, address string) (Listener, error

无尘的躺坑记录 629

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TCP Socket 编程实现 HTTP/1.1 服务器:Go 语言 100 行代码解析请求与响应

本文详细介绍了如何使用Go语言通过TCP Socket编程实现一个HTTP/1.1服务器,仅用100行代码解析请求与响应。从TCP连接处理到HTTP协议解析,再到响应构造与并发管理,全面展示了HTTP服务器的工作原理与实现细节,适合开发者深入理解网络编程基础。

weixin_34214500的博客 414

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HTTP/1.1 与 Socket 长连接实战:3种心跳包机制与 Go 语言 15 行实现

本文深入探讨了HTTP/1.1持久连接与Socket长连接的技术差异,并提供了三种心跳包机制的实现方法,包括基础心跳检测、智能自适应心跳和业务级心跳融合。通过15行Go语言代码展示了Socket长连接的实战实现,帮助开发者优化分布式系统和实时通信的连接管理。

weixin_30463341的博客 359

golang网络编程day1

今天的学习基本上都是有关理论上的了解和学习,由于之前学过计算机网络,所以大多感觉都是能接受,某些概念不懂就直接去找资料学就行了。明天开始进行对库函数的使用和实操。

TOMOT77的博客 947

Go——网络编程

在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议簇隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数,让Socket去组织符合指定的协议数据然后进行通信。UDP协议中文名称是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据的发送和接收,数据不可靠的,没有时序的通信,但是UDP协议的实时性比较好(快),通常用于视频直播相关领域。创建套接字,绑定套接字,监听套接字,监听到连接后,获取到监听套接字,然后往监听套接字中收发数据。

weixin_57023347的博客 1272

Go语言网络编程(socket编程)http编程

客户机通过TCP/IP协议建立到服务器的TCP连接客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。

编程技术, 日益精进 493

PHP 与go 通讯,Go socket实现多语言间通信

前言socket提供了在传输层进行网络编程的方法,它比基于http协议的接口传输更高效,RPC(Remote Procedure Call)是远程过程调用,常用于分布式系统等,而rpc很多是基于socket实现的。不了解socket、http等协议请阅读Socket 都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。它不局限于某一语言,这里我们主...

weixin_39612332的博客 352

【七天入门Go语言】 网络编程 | 第六天

目录1. Socket 编程1.1 Dial()函数1.2 ICMP 示例程序1.3 TCP 示例程序1.4 更丰富的网络通信2. HTTP 编程2.1 HTTP 客户端2.2 HTTP 服务端3. RPC 编程3.1 Go 语言中的 RPC 支持与处理3.2 Gob 简介3.3 设计优雅的 RPC 接口4. 网站开发4.1 最简单的网站程序4.2 net/http 包简介4.3 开发一个简单的相册网站 1. Socket 编程 1.1 Dial()函数 1.2 ICMP 示例程序 1.3 TCP 示例程序

面向生活编程 1487

golang websocket编程

上篇文章讲了TCP/IP的一些基础概念,并通过go内置的包实现了socket编程。本篇文章来了解一下另外一个概念——WebSocket。但从命名上来看WebSocket和Socket很类似,但是其实两者并没有直接的联系。Websocket跟HTTP对应,基是于TCP 协议之上的长连接应用层协议。Socket是操作系统抽象出来,方便我们使用TCP/UDP协议编程方法,属于传输层协议。两者其实没有直接...

卓立的博客 4157
上一篇: go语言错误处理
下一篇: go语言中的配置管理神器 --viper 一
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值