package main
import (
“fmt”
“net”
)
func process(conn net.Conn) {
//这里我们循环的接收客户端发送的数据
defer conn.Close()//关闭conn
for{
//创建一个新的切片
buf := make([]byte,1024)
//conn.Read(buf)
//1.等待客户端通过conn发送信息
//2.如果客户端没有wrtie[发送],那么协程就阻塞在这里。
//fmt.Printf(“服务器在等待客户端%s 发送信息\n”,conn.RemoteAdder().String())
fmt.Println(“服务器在等待客户端%s 发送信息”+conn.RemoteAddr().String())
n,err:=conn.Read(buf)//从conn读取
if err !=nil{//io.EOF
fmt.Printf(“服务器的Read err”,err)
return //!!!
}
//3.显示客户端发送的内容到服务器的终端
fmt.Print(string(buf[:n]))
}
}
/*
tcp socket编程的快速入门
服务端的处理流程
1)监听端口
2)接收客户端的tcp链接,建立客户端和服务器端的链接
3)创建goroutine,处理该链接的请求(通常客户端会通过链接发送请求包)
客户端的处理流程
1)建立于服务端的链接
2)发送请求数据,接收服务器端返回的结果数据
3)关闭链接
*/
//做网络socket开发时,net宝行有我们需要所有的方法和函数
func main(){
fmt.Println(“服务器开始监听…”)
//net.Listen(“tcp”,“0.0.0.0:8888”)
//1.tcp表示使用网络协议是tcp
//2.0.0.0.0:8888表示在本地监听8888端口
listen,err := net.Listen(“tcp”,“0.0.0.0:8888”)
if err !=nil{//如果err不等空,(如果监听失败了,打印错误,)
fmt.Println(“listen err”,err)
return
}
defer listen.Close()//延时关闭listen
//循环等待客户端来链接我
for{
//等待客户端链接
fmt.Println(“等待客户端来链接…”)
conn,err :=listen.Accept()//conn是一个接口,接口包含各种类型
if err!=nil {//如果err不等空,打印Accept的错误
fmt.Println(“Accept()err=”, err)
}else {//另外一个A客户端成功了
fmt.Printf(“Accept() suc con=%v\n”,conn,conn.RemoteAddr().String())
}
//这里准备一个协程,为客户端服务
go process(conn)
}
fmt.Printf(“listen suc=%v\n”,listen)//监听成功
//fmt.Printf(“listen suc=%v\n”,listen)
}
//telnet是来测试是否来链接的。比如telnet.www
//举例客户端A、B、服务端
/*
1)编一些一个客户端端程序,能连接到服务器端的8888端口
2)客户端可以发送但行数据,然后就退出
3)能通过终端输入数据(输入一行发送一行),并发送给服务器端口
4)在终端输入exit,表示退出程序。
*/