Tcp服务器
服务器端server.go:
一个(web)服务器(net)应用需要响应众多客户端的并发请求:go会为每一个客户端产生一个协程(go)用来处理请求。我们需要使用net包中网络通信的功能。它包含了用于TCP/IP以及UDP协议、域名解析等方法。
1.在main()创建一个net.Listener的变量,这是服务器的基本函数:用来监听和接收来自客户端的请求(来自localhost即IP地址为127.0.0.1端口为50000基于TCP协议)这个Listen()函数可以返回一个error类型的错误变量---------
2.用无线循环Listen.Accept()来等待客服端请求
3.客服端的请求将产生一个net.Conn类型的连续变量。然后一个独立的携程使用这个连续执行都ServerStuff(),开始使用一个512字节的缓冲data来读取客服端发送来的数据并且打印到服务器的终端
4.当客服端发送的所有数据都被读取完了的时,携程就结束了。
package main
import (
"fmt"
"net"
)
func main() {
fmt.Println("Starting the server ...")
// 创建 listener
listener, err := net.Listen("tcp", "localhost:50000")
if err != nil {
fmt.Println("Error listening", err.Error())
return //终止程序
}
// 监听并接受来自客户端的连接
for {
conn, err := listener.Accept()// 监听并且返回一个Conn接口
if err != nil {
fmt.Println("Error accepting", err.Error())
return // 终止程序
}
go doServerStuff(conn)//将Conn接口传入携程函数处理客服端信息
}
}
func doServerStuff(conn net.Conn) {
for {
buf := make([]byte, 512)//512字节的缓存
_, err := conn.Read(buf)//将Conn连接特点客服端的接口读取到的客服端内容保存到buf中
if err != nil {
fmt.Println("Error reading", err.Error())
return //终止程序
}
fmt.Printf("Received data: %v", string(buf))//输出buf的内容 %v相应值的默认格式。Printf("%v", people) {zhangsan},
}
}
客服端client.go:
1.通过net.Dial创建了一个和服务器之间的连接,---------在网络编程中net.Dial函数是非常重要的,一旦你连接到远程系统,就会返回一个Conn类型接口,我们可以用它发送和接收数据。Dial函数巧妙的抽象了网络结构及传输,所以IPv4或IPv6或TCP或UDP都可以使用这个接口
2.它通过无限循环中的os.Stdin接收来自键盘的输入直到输入“Q"。(注意 \r 和 \n 换行符分割字符串【在Windows平台下使用 \r\n】)
3.接下来分割后的输入通过 connection 的Write 方法被发送到服务器。(服务器必须先启动好)
4.在windows中可通过Ctrl + C停止程序
代码:
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
//打开连接:
conn, err := net.Dial("tcp", "localhost:50000")
if err != nil {
//由于目标计算机积极拒绝而无法创建连接
fmt.Println("Error dialing", err.Error())
return // 终止程序
}
inputReader := bufio.NewReader(os.Stdin)
fmt.Println("First, what is your name?")
clientName, _ := inputReader.ReadString('\n')
// fmt.Printf("CLIENTNAME %s", clientName)
trimmedClient := strings.Trim(clientName, "\r\n") // Windows 平台下用 "\r\n"
// 给服务器发送信息直到程序退出:
for {
fmt.Println("What to send to the server? Type Q to quit.")
input, _ := inputReader.ReadString('\n')
trimmedInput := strings.Trim(input, "\r\n")
// fmt.Printf("input:--s%--", input)
// fmt.Printf("trimmedInput:--s%--", trimmedInput)
if trimmedInput == "Q" {
return
}
_, err = conn.Write([]byte(trimmedClient + " says: " + trimmedInput))
}
}