2016-03-28 27 views
-2

Bir sohbet istemcisi oluşturmak için eko sunucu programımı değiştirmeye çalışıyorum. Şu anda, müvekkilimin başlamasında sunucumun bir bağlantı noktasını dinlemesini istiyorum. Ardından, istemci sunucuya bir mesaj yazıp gönderebilir ve sunucu bunu tekrarlar. Bununla birlikte, 2 istemciyi 2 farklı bağlantı noktasına bağlayabilmem ve istemcilerin sunucu üzerinden birbirlerine ileti göndermesine izin vermek istiyorum. Bunu yapmamın bir yolu var mı? İlk adımın bir tane yerine 2 portu dinleyeceğini varsayıyorum.1 Sunucuda 2 Bağlantı Noktası Dinleme

Şimdiye dek sahip olduğum şeyler.

Sunucu:

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)) 
     } 
} 

Müşteri:

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 sunucuda 2 istemcileri (port) dinlemek ve onları iletişim kurmasını sağlamak için herhangi bir yolu var mı? Bunu, aynı bağlantı noktasındaki iki istemciyle yapmak mümkün mü? Sunucu programına başka bir dinleyici eklemeyi denedim, ancak bu satırlar işe yaramadıkları için şimdilik yorum yaptım. Her türlü yardıma minnettar olurum!

+2

Neden? Tek bir bağlantı noktasıyla istediğiniz kadar istemciniz olabilir. Onları boşa harcamayın, onlar sınırlı bir kaynaktır. – EJP

+0

2 müşterinin mesajların birbirlerini oluşturduğunu görmesini istedim ve bunun tek yolu 2 bağlantı noktası olacağını düşündüm. Ağa ve Golang'a oldukça yeniyim, bu yüzden işleri yapmanın en iyi yolunu gerçekten bilmiyorum. Sadece 1 port kullanırken 2 istemci programı iletişim kurmanın bir yolu var mı? – user6126174

+0

Zaten bunu yapıyorsunuz. – EJP

cevap

3

Sorudaki sunucu kodu, aynı bağlantı noktasındaki birden fazla istemciyi ele alır.

ayrı goroutines bu dinleyiciler için kabul döngüler, iki port ile çalışan iki dinleyici oluşturmak ve çalıştırmak için:

Ayrıca
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) 
    } 
} 

, hataları göz ardı etmeyin. Bu cevaptaki kod, log.Fatal öğesini çağırarak hataları ele alır. Bu, başvurunuz için uygun olabilir veya olmayabilir.

+0

Teşekkürler! Bu bana biraz yardımcı olmalı. Go rutinlerini kullanarak yapabileceğimi düşündüm, ama nasıl olduğunu anlayamadım. Yakında hatalarla ilgilenmeyi planlıyorum, bu yüzden endişelenme! Tekrar teşekkürler! – user6126174

İlgili konular