在写一个之前接受消息

时间:2016-03-30 21:26:13

标签: networking go tcp chat

我有一台服务器可以侦听2个端口并在2个端口之间传输消息。唯一的问题是每个客户端(或每个端口)必须先提交一条消息,然后才能收到另一个端口发送的上一条消息。例如,如果客户端1说" hello",除非他首先发送消息,否则客户端2将不会收到消息。

我想找到一种方法来使每个客户端在发送新消息之前必须接收上一条消息。 (由于客户端1在客户端2说出某些内容之前无法接收任何内容,因此我计划向其发送一个包含占位符文本的字符串。)

任何人都可以帮我解决这个问题吗?我尝试将我的监听代码和我的代码用于为每个客户端编写一条消息到他们自己的例行程序中,但这并没有完成任务。任何帮助将不胜感激。

这是我的代码:

服务器

package main

import (
    "fmt"
    "log"
    "net"
)

var message string = "Client 2 is receiving your message"

func main() {
    fmt.Println("The server is listening on Port 3000 and 8080")
    //Set up listeners for the ports each client is using
    listener, err := net.Listen("tcp", "localhost:3000")
    if err != nil {
        log.Fatal(err) 
    }
    listener2, err := net.Listen("tcp", "localhost:8080")
    if err != nil {
        log.Fatal(err)
    }
    go acceptLoop(listener)
    acceptLoop(listener2)  // run in the main goroutine
}

func acceptLoop(l net.Listener) {
    defer l.Close()
    for {
            c, err := l.Accept()
            if err != nil {
                log.Fatal(err)
            }
            fmt.Println("New connection found!")
            go listenConnection(c)
    }
}

func listenConnection(conn net.Conn) {
        fmt.Println("Yay")
        for {
                buffer := make([]byte, 1400)
                dataSize, err := conn.Read(buffer)
                if err != nil {
                    fmt.Println("Connection has closed")
                    return
                }

                //This is the message you received
                data := buffer[:dataSize]
                fmt.Print("Received message: ", string(data))

                // Send the message back
                _, err = conn.Write([]byte(message))
                if err != nil {
                        log.Fatalln(err)
                }
                fmt.Print("Message sent: ", string(data))
                message = string(data)
        }
}

客户端1

    package main

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

func main() {
        conn, err := net.Dial("tcp", "localhost:3000")
        if err != nil {
                log.Fatalln(err)
        }

for {
        reader := bufio.NewReader(os.Stdin)
        fmt.Print("Enter text: ")
        text, _ := reader.ReadString('\n')

        _, err = conn.Write([]byte(text))
        if err != nil {
                log.Fatalln(err)
        }

        for {
                buffer := make([]byte, 1400)
                dataSize, err := conn.Read(buffer)
                if err != nil {
                        fmt.Println("The connection has closed!")
                        return
                }

                data := buffer[:dataSize]
                fmt.Println("Received message: ", string(data))
                break
        }

    }
}

我的第二个客户端与我的第一个客户端相同,除了" localhost:3000"替换为" localhost:8080"。

我将不胜感激任何帮助!我对网络和Go都很陌生,所以任何提示都会很棒。

1 个答案:

答案 0 :(得分:0)

现在你的Server只是一个回音。它响应从客户端收到的消息。

如果你想在两个客户端之间中继消息,你需要弄清楚的第一件事是如果3个客户端连接(2到第一个端口,1到另一个)会发生什么?

如果您希望只有一个客户端连接到每个端口,您可以执行以下操作( -go-code):

func main() {
  // ...
  # Channels must be buffered or else clients will deadlock.
  relay := make(chan string, 1)
  go acceptLoop(listener1, relay)
  acceptLoop(listener2, relay)
}

func acceptLoop(l, relay) {
  for {
    conn := l.Accept()
    for {
       relay <- conn.Read()
       conn.Write(<-relay)
    }
}