Go的收发TCP客户端

时间:2018-07-11 04:19:16

标签: go p2p tcp-ip

我正在尝试不使用任何库来实现自己的P2P网络。我想构建一个TCP客户端,该客户端从其他节点发送和接收消息。因此,所有节点都应该能够通过tcp / ip发送和接收消息。

我当前的问题是,当我启动两个客户端时:一个节点能够接收和发送消息,而另一个节点只是发送消息而不能接收消息。

我认为我需要以某种方式实现渠道,但是我真的是Go语言的新手,不知道如何实现它。有什么建议么?

以下代码:

Main.go:

package main

 func main() {

  address := "127.0.0.1:8081" // IP of the other node; hardcoded for now
  go startServer()
  startClient(address)

} 

helpler.go:

package main

import (
 "bufio"
 "fmt"
 "net"
 "os"
) 

func startClient(address string) {
 //connect to this socket
 connClient, _ := net.Dial("tcp", address)

for {

    //read in input from stdin
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Text to send: ")
    text, _ := reader.ReadString('\n')

    //send to socket
    fmt.Fprint(connClient, text+"\n")

    //listen for reply
    //message, _ := bufio.NewReader(connClient).ReadString('\n')
    //fmt.Print("Message from server: " + message)
  }
 }
func startServer() {
 fmt.Println("Starting...")

//listen on all interfaces
ln, _ := net.Listen("tcp", ":8081")

//accept connection on port
connServer, _ := ln.Accept()

//run loop forever
for {
    //will listen for message to process ending in newline(\n)
    message, _ := bufio.NewReader(connServer).ReadString('\n')

    //fmt.Print("Message Received:" + string(message))

    //sample process for string received
    //newmessage := strings.ToUpper(message)

    connServer.Write([]byte(message + "\n"))
  }
 }

2 个答案:

答案 0 :(得分:1)

这里是新手Go开发人员,但是我可以马上想到一个问题。您不能有多个进程在同一个IP和端口上侦听。

您可能对此有疑问,但是因为您没有检查错误,所以没有抓住它。如果您有用于检查错误的代码,则您可能会注意到您收到这样的错误:

  

2018/07/11 09:21:06监听tcp 127.0.0.1:8081:绑定:已经有地址

     

使用中退出状态1

即使不是您要解决的问题,进行错误检查仍然是一个好主意。

我建议您添加支票。例如

服务器端

ln, err := net.Listen("tcp", "127.0.0.1:8081")
if err != nil {
    log.Fatal(err)
}

客户端

  conn, err := net.Dial("tcp", "127.0.0.1:8081")
    if err != nil {
        fmt.Println("error:", err)
    }
  

我认为我需要以某种方式实现渠道

如上所述,我本人并不熟悉Go,但是我的理解是通道是同一程序中的进程间通信工具。与多个程序无关。如果您使用自己喜欢的搜索工具搜索转播频道,则可以找到更多信息,但不要相信这就是您想要的。

答案 1 :(得分:0)

尝试使用两个不同的进程作为服务器和客户端。

例如,在主要功能上:

func main() {
    connType := os.Getenv("TYPE")

    if connType == "server" {
        startServer()
    } else if connType == "client" {
        startClient()
    } else {
        log.Println("please provide the TYPE arg (TYPE=server or TYPE=client)")
    }
}

然后,您可以运行TYPE=server go run yourappTYPE=client go run yourapp。 您可以查看此GitHub存储库https://github.com/johannesridho/protobuf-over-tcp