|
|
@@ -0,0 +1,74 @@ |
|
|
|
package main |
|
|
|
|
|
|
|
import ( |
|
|
|
"net" |
|
|
|
"log" |
|
|
|
"fmt" |
|
|
|
) |
|
|
|
|
|
|
|
type Client struct { |
|
|
|
c * net.TCPConn |
|
|
|
w chan []byte |
|
|
|
r chan []byte |
|
|
|
} |
|
|
|
|
|
|
|
func NewClient() * Client { |
|
|
|
client := new(Client) |
|
|
|
wch := make(chan []byte, 2048) |
|
|
|
rch := make(chan []byte, 2048) |
|
|
|
client.w = wch |
|
|
|
client.r = rch |
|
|
|
addr, err := net.ResolveTCPAddr("127.0.0.1:4730") |
|
|
|
if err != nil { |
|
|
|
log.Panic(err.String()) |
|
|
|
} |
|
|
|
c, err := net.DialTCP("tcp", nil, addr) |
|
|
|
client.c = c |
|
|
|
if err != nil { |
|
|
|
log.Panic(err.String()) |
|
|
|
} |
|
|
|
go client.ReadLoop() |
|
|
|
go client.WriteLoop() |
|
|
|
return client |
|
|
|
} |
|
|
|
|
|
|
|
func (client * Client) ReadLoop() { |
|
|
|
for { |
|
|
|
buf := make([]byte, 2048) |
|
|
|
_, err := client.c.Read(buf) |
|
|
|
if err != nil { |
|
|
|
client.c.Close() |
|
|
|
break; |
|
|
|
} |
|
|
|
client.r <- buf |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func (client * Client) WriteLoop() { |
|
|
|
for { |
|
|
|
select { |
|
|
|
case buf := <- client.w: |
|
|
|
client.c.Write(buf) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func (client * Client) Write(data []byte) { |
|
|
|
client.w <- data |
|
|
|
} |
|
|
|
|
|
|
|
func (client * Client) Read() []byte{ |
|
|
|
var buf []byte |
|
|
|
select { |
|
|
|
case buf = <- client.r: |
|
|
|
} |
|
|
|
return buf |
|
|
|
} |
|
|
|
|
|
|
|
func main() { |
|
|
|
client := NewClient() |
|
|
|
client.Write([]byte("TEST\r\n")) |
|
|
|
for { |
|
|
|
fmt.Println(client.Read()) |
|
|
|
} |
|
|
|
} |