通道中Golang与TCP/IP套接字不工作

通道中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所以也许我错了(我大概是)

+0

你可以在问题本身中定义“不工作”吗? – Adrian

信道的使用看起来还好,从渠道然而检索值将覆盖之前,因为你的等待换行符阅读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) 
    } 
} 
+0

如果期望字符串,它更喜欢'chan string'。 – mattn

+0

@mattn好的建议,我会更新它。 – jeevatkm

+0

谢谢,整个代码是垃圾与HTML和任何,无法读取。 我用你的代码,但它会产生什么,我没有更多的消息,在我的文件... –