2016-03-28 13 views
-2

チャットクライアントを作成するためにエコーサーバープログラムを変更しようとしています。現在、クライアントを起動すると、サーバーがポートを傍受しています。次に、クライアントはサーバーにメッセージを入力して送信することができ、サーバーはそれをエコーバックします。1つのサーバー上の2つのポートを聴く

しかし、私は2つの異なるポートに2つのクライアントを接続し、クライアントがサーバー上でお互いにメッセージを送信できるようにしたいと思います。私はこれを行うことができる方法はありますか?私は最初のステップは1つではなく2つのポートを聴くことだと仮定しています。

これまで私がこれまで持っていたことは次のとおりです。

サーバー:

package main 

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

func main() { 
     fmt.Println("The server is listening on Port 3000") 
     listener, _ := net.Listen("tcp", "localhost:3000") 
     //listener2, _ := net.Listen("tcp", "localhost:8080") 

     defer listener.Close() 
     //defer listener2.Close() 

     // Listen for connections 
     for { 
       conn, _ := listener.Accept() 
       //conn2, _ := listener2.Accept() 
       fmt.Println("New connection found!") 

       go listenConnection(conn) 
       //go listenConnection(conn2) 
     } 
} 

//Listen for messages and reply 
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(data) 
       if err != nil { 
         log.Fatalln(err) 
       } 
       fmt.Print("Message sent: ", string(data)) 
     } 
} 

クライアント:

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 
     } 

    } 
} 

1台のサーバー上に2つのクライアント(ポート)に耳を傾け、彼らが通信できるようにする方法はありますか?同じポート上の両方のクライアントでこれを行うことは可能ですか?私はServerプログラムで別のリスナーを追加しようとしましたが、私はこれらのラインをコメントアウトしましたが、今は動作しませんでした。私はどんな助けにも感謝します!

+2

なぜですか? 1つのポートで多数のクライアントを好きなだけ持つことができます。それらを無駄にしないでください。有限のリソースです。 – EJP

+0

私は2人のクライアントにメッセージが見えるようにしたいと思っていました。それを行う唯一の方法は2つのポートであると思っていました。私はネットワーキングとゴランにはかなり慣れています。だから、私は物事を行うための最善の方法を本当に知っていません。 1つのポートだけを使用して2つのクライアントプログラムを通信させる方法はありますか? – user6126174

+0

あなたはすでにそれをやっています。 – EJP

答えて

3

質問のサーバーコードは、同じポート上の複数のクライアントを処理します。 2つのポートで動作する2人のリスナーを作成し、別のゴルーチンにこれらのリスナーのためのループを受け入れるを実行するには

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

また、エラーを無視しないでください。この回答のコードは、log.Fatalを呼び出すことによってエラーを処理します。それはあなたのアプリケーションに適しているかもしれません。

+0

ありがとう!これはかなり私を助けるはずです。私はGoルーチンを使って私がそれをやることができると思ったが、どうして全然分かりませんでした。私は間もなくエラーを処理する予定ですので、心配しないでください! もう一度おねがいします! – user6126174

関連する問題