2016-04-18 169 views
1

我有一個服務器和兩個客戶端,每個使用他們自己的端口。當客戶端向服務器發送消息時,服務器會將其回送給發件人。然後,服務器應該將消息發送給另一個客戶端。這是我遇到問題的地方。從一個端口發送消息到另一個端口

我相信我可能會在writeMessage()中設置錯誤的連接,但我不完全確定。目前,我只是試圖在端口8080上寫入客戶端2以進行調試。

服務器:

package main 

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

var message string = "" 

func main() { 
    fmt.Println("The server is listening on Port 3000 and 8080") 
    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) 


} 

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

func listenConnection(conn net.Conn) { 
     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(string(data)) 
       conn.Write(data) 
       message = string(data) 
       writeMessage() 
     } 
} 

func writeMessage(){ 
    conn2, e := net.Dial("tcp", "localhost:8080") 
    if e != nil { 
     log.Fatalln(e) 
    } 
    defer conn2.Close() 
    conn2.Write([]byte(message)) 
} 

客戶1:

package main 

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

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

     go listenConnection(conn, err) 
     writeMessage(conn, err) 

} 

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

       data := buffer[:dataSize] 
       fmt.Print("Server: ", string(data)) 
     } 
} 

func writeMessage(conn net.Conn, err error){ 
    for { 
     reader := bufio.NewReader(os.Stdin) 
     //fmt.Print("Enter message: ") 
     text, _ := reader.ReadString('\n') 
     text = "3000: " + text 

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

(我的第二個客戶是一樣的我的第一個除3000端口替換8080)

爲了複製問題是,用戶必須運行服務器代碼,然後運行這兩個客戶端。客戶端然後可以將消息發送到服務器。

任何幫助,這將不勝感激。我根本無法弄清楚這一點。希望一些更有經驗的Go用戶能夠提供幫助!

回答

0

你的邏輯似乎有缺陷,acceptloop要求listenconnection,它會在無限循環內創建一個無限循環。我認爲你需要用用例方案重建系統。

如果我的理解是正確的,你喜歡有一臺服務器等待客戶端連接。首先,client1進來,發送一些數據。服務器接受此連接,並且只需要爲每個客戶端接受一次。此時,如果客戶端2在線,則將數據發送到客戶端2。所有這些都發生在無限循環中。

結帳這個代碼 https://play.golang.org/p/_5AREG3jnG

+0

這只是我需要的東西!看來我讓這種方式比它所需要的更復雜。謝謝! – user3369414

相關問題