来源:未知 时间:2018-08-31 17:48 作者:小飞侠 阅读:次
[导读] 废话不多说先上代码: 服务端代码server.go packagemainimport(netfmttimebytesio)funcmain(){add:=new(net.TCPAddr)add.IP=net.ParseIP(127.0.0.1)add.Port=7777tcpl,err:=net.ListenTCP(tcp,add)iferr!=nil{fmt.Println(err)}for{conn,err:=...
废话不多说先上代码: 服务端代码server.go package main import ( "net" "fmt" "time" "bytes" "io" ) func main() { add:=new(net.TCPAddr) add.IP= net.ParseIP("127.0.0.1") add.Port=7777 tcpl,err:=net.ListenTCP("tcp", add) if err != nil { fmt.Println(err) } for{ conn,err:=tcpl.Accept() if err != nil { fmt.Println(err) } handleClient(conn) } } func handleClient(conn net.Conn) { defer conn.Close() var buf bytes.Buffer _, err := io.Copy(&buf, conn) if err != nil { fmt.Println("读取错误") } fmt.Println(string(buf.Bytes())) data:=buf.Bytes() fmt.Println(len(data)) if len(data)==0 { daytime := time.Now().String() //不需要关心返回值 conn.Write([]byte(daytime)) }else{ //不需要关心返回值 conn.Write([]byte(string(buf.Bytes()))) } } 服务端监听本地IP(127.0.0.1)7777端口。当有客户端连接时,获得一个conn 对象,coon 对象是 interface Conn的实现者, 下面先给给出interface 的结构 里面可以看到这个inteface 包含那些方法。 type Conn interface { // Read reads data from the connection. // Read can be made to time out and return an Error with Timeout() == true // after a fixed time limit; see SetDeadline and SetReadDeadline. Read(b []byte) (n int, err error) // Write writes data to the connection. // Write can be made to time out and return an Error with Timeout() == true // after a fixed time limit; see SetDeadline and SetWriteDeadline. Write(b []byte) (n int, err error) // Close closes the connection. // Any blocked Read or Write operations will be unblocked and return errors. Close() error // LocalAddr returns the local network address. LocalAddr() Addr // RemoteAddr returns the remote network address. RemoteAddr() Addr // SetDeadline sets the read and write deadlines associated // with the connection. It is equivalent to calling both // SetReadDeadline and SetWriteDeadline. // // A deadline is an absolute time after which I/O operations // fail with a timeout (see type Error) instead of // blocking. The deadline applies to all future and pending // I/O, not just the immediately following call to Read or // Write. After a deadline has been exceeded, the connection // can be refreshed by setting a deadline in the future. // // An idle timeout can be implemented by repeatedly extending // the deadline after successful Read or Write calls. // // A zero value for t means I/O operations will not time out. SetDeadline(t time.Time) error // SetReadDeadline sets the deadline for future Read calls // and any currently-blocked Read call. // A zero value for t means Read will not time out. SetReadDeadline(t time.Time) error // SetWriteDeadline sets the deadline for future Write calls // and any currently-blocked Write call. // Even if write times out, it may return n > 0, indicating that // some of the data was successfully written. // A zero value for t means Write will not time out. SetWriteDeadline(t time.Time) error } 最后读取响应头,读到[]byte 里面 最后转成string 返回给客户端。如果客户端没有发来任何字符,则选择时间返回给客户端。 客户端代码 package main import ( "net" "bytes" "io" "fmt" ) func main() { add:=new(net.TCPAddr) add.IP= net.ParseIP("127.0.0.1") add.Port=7777 conn,err:=net.DialTCP("tcp",nil,add) if err!=nil{ fmt.Println(err) } //conn.Write([]byte("hello")) conn.CloseWrite() var buf bytes.Buffer _, err = io.Copy(&buf, conn) fmt.Println(string(buf.Bytes())) } 客户端发起请求将收到的数据转成字符串打印出来。客户端可以选择向服务端发数据或者不发数据。如果发数据服务端会将客户端发送的数据转发给客户端,如果没有服务端会把时间转发给客户端。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com