学习周期: 5.12学习了go基础和go语言实战的猜数字+词典实现 5.13实现了go语言实战的socks5代理实现
go基础部分没什么说的,课程介绍了常用的语法。但是只是很快的过一遍,我没有完全上手写过,后面遇到不熟悉的语法元素还是要查,等上手写的时候再好好查好好学
go语言实战这节课就比较重要+有意思了,除了猜谜游戏之外我都听的似懂非懂or有很多疑惑的的点,所以结合chatgpt进行了笔记总结。
我主要是用macos环境下vscode+chrome写go的几个项目的。 环境配置流程就是:官网下载go的安装包->本地安装->把go加到环境变量里->vscode里写码->命令行编译运行
我的vscode的go环境其实还没完全配好,但是通过命令行运行还是可以输出正确结果的。vscode的环境以后慢慢配
1.猜谜游戏
设计实现的逻辑就是: 是用time包获得一个时间戳,使得随机数函数rand可以基于时间戳随机生成不同的数字,这个数字就是要猜的数字secretNumber。fmt.Println函数输出secretNumber。 接着用户输入某个数字,程序中用bufio或者fmt.scanf读取用户的输入数据。通过if,else判断用户的输入是比secretNumber大还是小。如果相等就输出
- bufio跟fmt.scanf有啥区别呢?
bufio 和 fmt.Scanf 都是 Go 语言中常用的输入函数,但是它们在使用和功能上有一些不同。
-
bufio.Reader:
bufio是一个带缓冲的 I/O 包,它在io包的基础上提供了缓冲和文本 I/O 的功能。bufio.Reader是bufio包中的一个类型,可以提供很多方法,如Read,ReadByte,ReadBytes,ReadLine,ReadRune,ReadString等等,用于从输入源读取数据。使用bufio.Reader可以更高效地从 I/O 设备(如文件、网络连接等)读取数据,因为它会尽可能地一次读取大量数据到内存缓冲区,而不是每次需要数据时都直接从 I/O 设备读取,这样可以减少 I/O 操作的次数,提高读取效率。 -
fmt.Scanf:
fmt包提供了格式化 I/O 的功能,类似于 C 语言的printf和scanf。fmt.Scanf函数从标准输入读取文本,根据指定的格式将读取的文本转换为 Go 语言的值。fmt.Scanf对于解析格式化的输入非常方便,但如果输入的格式与预期不符,fmt.Scanf可能会出现问题。总的来说,如果你需要读取的数据量很大,或者你需要更多的控制来读取数据(例如读取一行,读取一个字节,读取一个字符等),你可能会更倾向于使用
bufio.Reader。如果你需要读取的是格式化的文本,并且你确信输入会符合预期的格式,fmt.Scanf可能会更方便。
2.在线词典
基于彩云词典实现了一个命令行词典
打开彩云在线词典后,输入某个单词点翻译之后,网页里才会有数据的传输(请求)。因为请求比较复杂,所以就直接用转换网站转换成go语言代码。这个时候打开chrome开发者工具,找到network-dict-general,在general这里右键copy as curl, 在curlconverter.com网站中转换成go程序粘贴复制到我们自己的程序中。
此时还不能通过输入不同的单词获得不同的输出,输出的结果也并不符合我们的要求。
因此我们要设计合适的输入输出数据。DictRequest 和 DictResponse 是两个结构体,它们分别定义了向 API 发送请求的数据格式和从 API 接收响应的数据格式。
DictRequest其实是json格式的数据,从main函数中获取,利用json.Marshal函数。
DictResponse是从api接受的json数据。从api接收的json格式非常复杂,我们通过在彩云小译网页中打开开发者工具,点preview,在第一行{rc: 0,_ }处右键copy as value, 把复制的信息粘贴到oktools.net/json2go 网页中,点击“转换-嵌套”,生成DictResponse结构体复制到自己的代码中。
观察一下网页发现我们需要的结果是dictionary,explanations,最后输出符合要求的结果即可。
- cURL是什么东西?
cURL 是一个强大的命令行工具,用于获取或发送数据,支持许多协议,包括 HTTP、HTTPS、FTP、FTPS、SFTP、SCP、LDAP、LDAPS、DICT、TELNET、FILE 等。cURL 也可以用于发送和接收邮件(支持 POP3、IMAP、SMTP 协议)。此外,cURL 还支持 SSL 证书、HTTP POST、HTTP PUT、FTP 上传、HTTP 基于表单的上传、代理、cookies 等。
cURL 在网络调试、API 测试、数据下载等许多场景下都非常有用。它的名称是“Client for URLs”的缩写。
cURL 还有一个相应的库 libcurl,可以让开发者在自己的程序中使用 cURL 的功能。
- main 函数里os.Args是个啥东西 它是是从命令行获取的参数。第一个参数是我们要用的命令。第二个参数就是我们输入的单词。
3. socks5代理服务器简易版实现
因为我计网学的很不好,所以这一部分主要是通过chatgpt辅助学习理解的。
-
首先我的巨大困惑就是为什么要用sorks5呢?它是用来干嘛呢?
通常,客户端和服务器之间的连接都是三次握手四次挥手建立连接。但是,出于保护隐私和安全等考虑,我们会先让客户端和代理服务器进行连接,再让代理服务器与真正的服务器进行连接。 socks5就是客户端和代理服务器之间进行连接的网络协议。 Socks5 是一个网络协议,主要用于客户端与服务器之间的网络请求代理。Socks5 协议的执行过程可以分为三个阶段: 1. **握手阶段**:客户端和服务器先进行一次握手,客户端发送一个请求给服务器,包含自己支持的认证方式(包括无需认证)。服务器从客户端提供的认证方式中选择一个支持的方式回应客户端。 2. **认证阶段**:如果在握手阶段服务器选择的认证方式需要进一步认证(例如用户名密码认证),那么会进入认证阶段。客户端发送认证信息给服务器,服务器验证后返回一个状态,告知客户端认证成功还是失败。注意,如果握手阶段服务器选择的是“无需认证”,则这一阶段会被跳过。 3. **请求阶段**:认证通过后,客户端会发送一个请求给服务器,请求包含需要访问的远程服务器的地址和端口,以及请求的类型(通常是TCP连接或者UDP关联)。服务器接收到请求后会尝试根据请求内容建立对应的连接,然后返回一个响应给客户端,响应中包含了请求的结果以及代理服务器用于转发数据的地址和端口。 在以上过程完成后,Socks5 代理服务器就会转发客户端和目标服务器之间的所有数据。 注意:Socks5 协议本身只是一个代理协议,它并不关心具体的网络数据是什么,也不提供加密等功能。如果需要安全的网络代理,通常会配合使用例如 SSL/TLS 等加密协议。
这是一个简单的 SOCKS5 代理服务器的实现。SOCKS5 是一个网络协议,它将客户端的网络连接请求转发到其他服务器。这个简单的代理服务器只支持 CONNECT 命令和无认证的方法。这里是代码的主要部分的详解:
main函数:
首先,程序在本地地址 127.0.0.1 的 1080 端口上启动一个 TCP 服务器。然后,它在无限循环中等待客户端的连接请求。
process函数: 每当一个客户端连接到服务器,它都会创建一个新的 goroutine 来处理这个连接。这个新的 goroutine 首先会执行 SOCKS5 的认证过程,然后处理客户端的 CONNECT 请求。
auth函数:
在 auth 函数中,服务器首先读取客户端发送的认证请求。由于这个简单的服务器只支持无认证的方法,它会忽略客户端提供的认证方法,并回复一个无认证的响应。
connect函数:
在 connect 函数中,服务器处理客户端的 CONNECT 请求。它读取客户端的请求,解析出目标服务器的地址和端口,然后创建一个到目标服务器的连接。然后,它发送一个成功的响应给客户端,并开始在客户端和目标服务器之间转发数据。
-defer函数
在 Go 语言中,defer 关键字用于确保一个函数调用在程序执行结束时,或者包含该 defer 语句的函数执行完毕时,会被执行。其主要用于资源的清理工作,例如关闭文件、解锁一个加锁的资源,或者检查函数执行的时间等。你可以在一个函数内部调用多个 defer 语句,它们会以LIFO(后进先出)的顺序执行。