一. 服务端接收数据并返回数据
- 服务端代码 ```go package main
import ( “net” “fmt” )
func main() { //创建TCPAddress变量,指定协议tcp4,监听本机8899端口 addr, _ := net.ResolveTCPAddr(“tcp4”, “localhost:8899”)
//监听TCPAddress设定的地址 lis, _ := net.ListenTCP(“tcp4”, addr)
fmt.Println(“服务器已启动”)
//阻塞式等待客户端消息,返回连接对象,用于接收客户端消息或向客户端发送消息 conn, _ := lis.Accept()
//把数据读取到切片中 b := make([]byte, 256) fmt.Println(“read之前”) //客户端没有发送数据且客户端对象没有关闭,Read()将会阻塞,一旦接收到数据就不阻塞 count, _ := conn.Read(b) fmt.Println(“接收到的数据:”, string(b[:count]))
/ 向客户端发送数据 / conn.Write([]byte(“这是服务器传递的数据”))
//关闭连接 conn.Close() fmt.Println(“服务器结束”) }
- 客户端代码
```go
package main
import (
"net"
"fmt"
)
func main() {
//服务器端ip和端口
addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
//申请连接客户端
conn, _ := net.DialTCP("tcp4", nil, addr)
//向服务端发送数据
count, _ := conn.Write([]byte("客户端传递的数据"))
fmt.Println("客户端向服务端发送的数据量为:", count)
/*
接收服务器传递回来的数据
*/
b := make([]byte, 256)
c, _ := conn.Read(b)
fmt.Println(string(b[:c]))
////关闭连接
conn.Close()
fmt.Println("客户端结束")
}
- 可以在服务端添加循环,不停接收客户端发送来的数据,服务端代码修改如下 ```go package main
import ( “net” “fmt” )
func main() { addr, := net.ResolveTCPAddr(“tcp4”, “localhost:8899”) lis, := net.ListenTCP(“tcp4”, addr) fmt.Println(“服务器已启动”)
/ 服务器端添加死循环,不停的接收客户端对象 / for { conn, := lis.Accept() b := make([]byte, 256) count, := conn.Read(b) nc := string(b[:count]) fmt.Println(“接收到的数据:”, nc) conn.Write([]byte(“服务器:” + nc)) conn.Close() } fmt.Println(“服务器结束”) }
- 客户端代码修改如下
```go
package main
import (
"net"
"fmt"
"strconv"
)
func main() {
//服务器端ip和端口
addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
//通过循环,模拟发送五次客户端请求
for i := 1; i <= 5; i++ {
conn, _ := net.DialTCP("tcp4", nil, addr)
conn.Write([]byte("客户端数据" + strconv.Itoa(i)))
b := make([]byte, 256)
c, _ := conn.Read(b)
fmt.Println("第", i, "次服务器返回的数据:", string(b[:c]))
conn.Close()
}
fmt.Println("客户端结束")
}
三.并发访问
- 上面代码的问题是服务器获取到客户端对象后,如果客户端什么也没有输入,其他客户端无法连接.可以通过结合goroutine完成并发访问
- 只需要修改server.go,在里面添加goroutine ```go package main
import ( “net” “fmt” )
func main() { addr, := net.ResolveTCPAddr(“tcp4”, “localhost:8899”) lis, := net.ListenTCP(“tcp4”, addr) fmt.Println(“服务器已启动”)
/ 服务器端添加死循环,不停的接收客户端对象 / for { conn, := lis.Accept() go func() { //在此处添加创建go func()即可 b := make([]byte, 256) count, := conn.Read(b) nc := string(b[:count]) fmt.Println(“接收到的数据:”, nc) conn.Write([]byte(“服务器:” + nc)) conn.Close() }() } fmt.Println(“服务器结束”) } ```