网站地图    收藏   

主页 > 专题教程 > go语言 >

go 的入门之路 Socket 编程

来源:未知    时间: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

添加评论