[日常] Go语言圣经--Channel习题
2023-02-18 15:41:38 时间
练习 8.3: 在netcat3例子中,conn虽然是一个interface类型的值,但是其底层真实类型是*net.TCPConn,代表一个TCP连接。一个TCP连接有读和写两个部分,可以使用CloseRead和CloseWrite方法分别关闭它们。修改netcat3的主goroutine代码,只关闭网络连接中写的部分,这样的话后台goroutine可以在标准输入被关闭后继续打印从reverb1服务器传回的数据。(要在reverb2服务器也完成同样的功能是比较困难的;参考练习 8.4。)
1.
net.Dial()
func Dial(network, address string) (Conn, error)
2.net.TCPConn
type TCPConn struct {
// contains filtered or unexported fields
}
TCPConn is an implementation of the Conn interface for TCP network connections.
package main import ( "io" "log" "net" "os" ) func main() { conn, err := net.Dial("tcp", "localhost:8040") if err != nil { log.Fatal(err) } //内置make函数创建一个channel,可以发送struct类型的数据 done := make(chan struct{}) //go语句调用一个函数字面量,启动goroutine的常用形式 go func() { //从网络连接到标准输出,如果连接没断也会阻塞 //如果TCP的读连接关闭会报错:use of closed network connection _, err := io.Copy(os.Stdout, conn) log.Println(err) log.Println("done") //发送channel给接收goroutine done <- struct{}{} }() //从标准输入到网络连接中,这个地方会阻塞,按Control+D关闭标准输入 mustCopy(conn, os.Stdin) // conn.Close() //类型断言,调用*net.TCPConn的方法CloseWrite()只关闭TCP的写连接 cw := conn.(*net.TCPConn) cw.CloseWrite() <-done // 阻塞等待后台 goroutine 完成接收channel } func mustCopy(dst io.Writer, src io.Reader) { if _, err := io.Copy(dst, src); err != nil { log.Fatal(err) } }
相关文章
- Linux系统账户后门及排查
- [Go] golang的用途和windows搭建环境
- Linux操作系统root账号密码获取防范技术研究
- [Linux] Linux系统(进程管理)
- [Linux] ssh秘钥对免密码登陆
- [Linux] Linux系统(用户管理)
- [Linux] Linux系统(文件操作)
- [Linux] Linux系统(登陆、退出、修密码)
- [Linux] host dig nslookup查询域名的DNS解析
- [javaSE] 看博客学习多线程的创建方式和优劣比较和PHP多线程
- [Linux] memache打印所有的key
- [Linux] awk与posix字符集
- [MongoDB] mongodb与php
- [Go] golang连接redis测试
- [Linux] awk基础编程
- [Linux] 取两个文件的并集/交集/差集
- [Linux] 搭建rsync服务端
- [Linux] scp本地服务器和远程服务器拷贝文件
- [Linux] 大数据库导出大文件统计并去重
- [Go] golang连接查询mysql