package RequestCenter import ( "bytes" "io" "net" "runtime" "strings" "time" ) //請求結構體 type QRequest struct { conn net.Conn } //構造函數 func CreateRequest(typename string, host string) *QRequest { request := new(QRequest) //GC析構前調用 runtime.SetFinalizer(request, func(q *QRequest) { q.Close() }) conn, err := net.Dial(typename, host) if err == nil { request.conn = conn return request } return nil } func CreateRequestWithConn(conn net.Conn) *QRequest { request := new(QRequest) //GC析構前調用 runtime.SetFinalizer(request, func(q *QRequest) { q.Close() }) request.conn = conn return request } //析構函數 func (q *QRequest) Close() { if !q.CheckReq() { return } q.conn.SetDeadline(time.Now()) q.conn.Close() } //發送內容 func (q *QRequest) SendData(heads []string, body []byte) bool { if !q.CheckReq() { return false } var headsStr string if len(heads) > 0 { headsStr = strings.Join(heads, "\r\n") + string(body) count, err := q.conn.Write([]byte(headsStr)) if err != nil || count == 0 { return false } return true } else { count, err := q.conn.Write(body) if err == nil || count == 0 { return false } return true } } //接收內容 func (q *QRequest) ReceiveData(timeout time.Duration) []byte { if !q.CheckReq() { return nil } if timeout > 0 { q.conn.SetReadDeadline(time.Now().Add(time.Millisecond * timeout)) } var buf bytes.Buffer buffer := make([]byte, 8192) for { sizenew, err := q.conn.Read(buffer) buf.Write(buffer[:sizenew]) if err == io.EOF || sizenew < 8192 { break } } return buf.Bytes() } func (q *QRequest) CheckReq() bool { if q == nil || q.conn == nil { return false } return true }