通道中Golang与TCP/IP套接字不工作
问题描述:
我刚开始书面方式一Golang客户端,我已经用C与TCP/IP套接字由一台服务器,然后我想通了,我的路是行不通的。通道中Golang与TCP/IP套接字不工作
任何想法,为什么?
func reader(r io.Reader, channel chan<- []byte) {
buf := make([]byte, 2048)
for {
n, err := r.Read(buf[:])
if err != nil {
return
}
channel <- buf[0:n]
}
}
func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan []byte)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
buf := <-read
n := strings.Index(string(buf), "\n")
if n == -1 {
continue
}
msg := string(buf[0:n])
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}
测试我的服务器的netcat结果如下输出: http://pasted.co/a37b2954
而我有的只是:http://pasted.co/f13d56b4
我是新来的陈中Golang所以也许我错了(我大概是)
答
信道的使用看起来还好,从渠道然而检索值将覆盖之前,因为你的等待换行符阅读buf := <-read
值。你
也可以使用bufio.Reader
阅读串高达换行符。
您的代码段是局部的,以便其不执行,尽量让我知道可行:
func reader(r io.Reader, channel chan<- string) {
bufReader := bufio.NewReader(conn)
for {
msg, err := bufReader.ReadString('\n')
if err != nil { // connection error or connection reset error, etc
break
}
channel <- msg
}
}
func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan string)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
msg := <-read
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}
//...
}
编辑:
请找到例如通用的TCP客户端读取数据。我也从上面的代码片段中删除了扫描器并添加了缓冲区读取器。
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
reader := bufio.NewReader(conn)
for {
msg, err := reader.ReadString('\n')
if err != nil {
break
}
fmt.Println(msg)
}
}
你可以在问题本身中定义“不工作”吗? – Adrian