package main
import(
"fmt"
"net"
)
func process(conn net.Conn) {
//延迟关闭目前连接
defer conn.Close()
for{
buf:=make([]byte, 1024)
fmt.Printf("服务器在等待客户端%s 发送信息\n", conn.RemoteAddr().String())
n, err:=conn.Read(buf)
if err!=nil{
fmt.Printf("客户端退出 err=%v\n",err)
return
}
fmt.Printf(string(buf[:n]))
}
}
func main(){
fmt.Printf("服务器开始监听...")
//监听一个端口
listen, err:=net.Listen("tcp", ":8888")
if err!=nil{
fmt.Println("listen err=",err)
return
}
//延迟关闭连接
defer listen.Close()
//循环等待客户端来连接
for{
fmt.Println("等待客户端来连接...")
conn, err:=listen.Accept()
//错误处理和输出当前连接客户端信息
if err!=nil{
fmt.Println("Accept() err=", err)
}else{
fmt.Printf("Accept() suc con=%v 客户端ip=%v\n", conn, conn.RemoteAddr().String())
}
//开一个协程专门处理当前连接的客户端
go process(conn)
}
}
二、客户端代码:
package main
import(
"fmt"
"net"
"bufio"
"os"
"strings"
)
func main() {
//建立连接
conn, err:=net.Dial("tcp", "127.0.0.1:8888")
if err!=nil{
fmt.Println("client dial err=",err)
return
}
//从标准输入流当中获取一个reader,方便客户端用户输入
reader:=bufio.NewReader(os.Stdin)
for{
line,err:=reader.ReadString('\n')
//错误处理
if err!=nil{
fmt.Println("readString err=",err)
}
//如果用户输入的是exit就退出
line=strings.Trim(line, " \r\n")
if line=="exit"{
fmt.Println("客户端退出...")
break
}
//将line发送给服务端
n,err:=conn.Write([]byte(line))
if err!=nil{
fmt.Println("conn.Write err=", err)
}
fmt.Printf("客户端发送了%d字节的数据\n", n)
}
}
三、运行结果:
(1)服务端
(2)客户端