服务端
package main
import (
"strings"
"fmt"
"net"
)
// 这是服务端接受参数,同时把参数返回回去,如果遇到参数为exit,那么断开连接
func handleConn (conn net.Conn){
// 获取连接着的ip
addrIP := conn.RemoteAddr().String()
fmt.Printf("%s 已连接", addrIP)
buf := make ([]byte, 1024*2)
// 这里要放到最前面,因为只有放到最前面才能被执行,否则的话,
// 下面退出了,结果这里还没有关闭,容易造成客户端长时间等待响应
defer conn.Close()
for {
n, err:= conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err = ",err)
return
}
result := strings.ToUpper( string( buf[:n] ) )
fmt.Println( result )
// 检查是否是退出行为,也就是是否检测到了exit
//其实这里多了一个字符,那么需要把最后的\n去掉,然后再比较
if string( buf[:n - 2] ) == "exit" {
fmt.Printf("%s 已退出", addrIP)
return
}
// 把数据返回回去
conn.Write( []byte (result))
}
}
func main () {
// 创建一个服务
Server,err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("listen err = ",err)
return
}
defer Server.Close()
// for循环代表时刻保持连接
for {
conn, err:= Server.Accept()
if err != nil {
fmt.Println("conn err = ",err)
return
}
defer conn.Close()
go handleConn(conn)
}
}
客户端
package main
import (
"os"
"net"
"fmt"
)
func main ( ) {
conn,err := net.Dial("tcp", "127.0.0.1:8000");
if err != nil {
fmt.Println("conn err = ", err)
// 终止主协程
return
}
// defer conn.Close()
// 输入
str := make([]byte, 1024 * 2)
go func ( ) {
for {
n,err := os.Stdin.Read(str)
if err != nil {
fmt.Println("err = ", err)
}
// 拿到数据
// 去发送
// 发送之前判断,最好不要这样
// if string( str[:n-2] ) == "exit" {
// return
// }
conn.Write(str[:n]);
}
} ()
// 创建一个协程,,用来输入
for {
buf := make ( [] byte, 1024 * 2);
defer conn.Close()
n,err:=conn.Read(buf)
if err != nil {
return
}
result := string(buf[:n]);
fmt.Println("result = ",result)
}
}
网友评论