|
|
@@ -35,18 +35,18 @@ func main() {
|
|
|
func doServerStuff(conn net.Conn) {
|
|
|
for {
|
|
|
buf := make([]byte, 512)
|
|
|
- _, err := conn.Read(buf)
|
|
|
+ len, err := conn.Read(buf)
|
|
|
if err != nil {
|
|
|
fmt.Println("Error reading", err.Error())
|
|
|
return //终止程序
|
|
|
}
|
|
|
- fmt.Printf("Received data: %v", string(buf))
|
|
|
+ fmt.Printf("Received data: %v", string(buf[:len]))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
-我们在`main()`创建了一个`net.Listener`的变量,他是一个服务器的基本函数:用来监听和接收来自客户端的请求(来自localhost即IP地址为127.0.0.1端口为50000基于TCP协议)。这个`Listen()`函数可以返回一个`error`类型的错误变量。用一个无限for循环的`listener.Accept()`来等待客户端的请求。客户端的请求将产生一个`net.Conn`类型的连接变量。然后一个独立的携程使用这个连接执行`doServerStuff()`,开始使用一个512字节的缓冲`data`来读取客户端发送来的数据并且把它们打印到服务器的终端;当客户端发送的所有数据都被读取完成时,携程就结束了。这段程序会为每一个客户端连接创建一个独立的携程。必须先运行服务器代码,再运行客户端代码。
|
|
|
+我们在`main()`创建了一个`net.Listener`的变量,他是一个服务器的基本函数:用来监听和接收来自客户端的请求(来自localhost即IP地址为127.0.0.1端口为50000基于TCP协议)。这个`Listen()`函数可以返回一个`error`类型的错误变量。用一个无限for循环的`listener.Accept()`来等待客户端的请求。客户端的请求将产生一个`net.Conn`类型的连接变量。然后一个独立的携程使用这个连接执行`doServerStuff()`,开始使用一个512字节的缓冲`data`来读取客户端发送来的数据并且把它们打印到服务器的终端,`len`获取客户端发送的数据字节数;当客户端发送的所有数据都被读取完成时,携程就结束了。这段程序会为每一个客户端连接创建一个独立的携程。必须先运行服务器代码,再运行客户端代码。
|
|
|
|
|
|
客户端代码写在另外一个文件client.go中:
|
|
|
|
|
|
@@ -106,7 +106,7 @@ func main() {
|
|
|
|
|
|
然后开启2个或者3个独立的控制台窗口,然后分别输入client回车启动客户端程序
|
|
|
|
|
|
-以下是服务器的输出(在移除掉512字节的字符串中内容为空的区域后):
|
|
|
+以下是服务器的输出:
|
|
|
```
|
|
|
Starting the Server ...
|
|
|
Received data: IVO says: Hi Server, what's up ?
|
|
|
@@ -229,7 +229,7 @@ func main() {
|
|
|
func initServer(hostAndPort string) *net.TCPListener {
|
|
|
serverAddr, err := net.ResolveTCPAddr("tcp", hostAndPort)
|
|
|
checkError(err, "Resolving address:port failed: '"+hostAndPort+"'")
|
|
|
- listener, err := net.ListenTCP("tcp", serverAddr)
|
|
|
+ listener, err := net.Listen("tcp", serverAddr)
|
|
|
checkError(err, "ListenTCP: ")
|
|
|
println("Listening to: ", listener.Addr().String())
|
|
|
return listener
|