2016-09-19 19 views
1

私はチャットアプリケーションを作るために小さなGoLang TCPサーバーを開発しました。しかし、私はそれにクライアントを接続しようとすると、サーバーは2つのクライアントで正常に動作しますが、私は3番目のクライアントに接続しようとするたびに、それはサーバーに接続されていません。私は窓で走っています。誰が私を助けることができる問題は何ですか?Golang TCPサーバーへの複数の接続

package main 

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

var allClients map[*Client]int 

type Client struct { 
    // incoming chan string 
    outgoing chan string 
    reader  *bufio.Reader 
    writer  *bufio.Writer 
    conn  net.Conn 
    connection *Client 
} 

func (client *Client) Read() { 
    for { 
     line, err := client.reader.ReadString('\n') 
     if err == nil { 
      if client.connection != nil { 
       client.connection.outgoing <- line 
      } 
      fmt.Println(line) 
     } else { 
      break 
     } 

    } 

    client.conn.Close() 
    delete(allClients, client) 
    if client.connection != nil { 
     client.connection.connection = nil 
    } 
    client = nil 
} 

func (client *Client) Write() { 
    for data := range client.outgoing { 
     client.writer.WriteString(data) 
     client.writer.Flush() 
    } 
} 

func (client *Client) Listen() { 
    go client.Read() 
    go client.Write() 
} 

func NewClient(connection net.Conn) *Client { 
    writer := bufio.NewWriter(connection) 
    reader := bufio.NewReader(connection) 

    client := &Client{ 
     // incoming: make(chan string), 
     outgoing: make(chan string), 
     conn:  connection, 
     reader: reader, 
     writer: writer, 
    } 
    client.Listen() 

    return client 
} 

func main() { 
    allClients = make(map[*Client]int) 
    listener, _ := net.Listen("tcp", ":8080") 
    for { 
     conn, err := listener.Accept() 
     if err != nil { 
      fmt.Println(err.Error()) 
     } 
     client := NewClient(conn) 
     for clientList, _ := range allClients { 
      if clientList.connection == nil { 
       client.connection = clientList 
       clientList.connection = client 
       fmt.Println("Connected") 
      } 
     } 
     allClients[client] = 1 
     fmt.Println(len(allClients)) 
    } 
} 
+1

3番目のクライアントを接続するとエラーが発生しますか?そのエラーは何ですか? – AJPennster

+2

マップを同時に使用することはできません。レースディテクタでコードをチェックしてください。 – JimB

+0

@AJPennster取得中 GetFileAttributesEx client.go:指定されたファイルが見つかりません。サーバー側のクライアント側でエラーが発生しました。何も表示されません。私は窓で走っています。 – shubham003

答えて

0

コードは問題ありません。私はLinuxでコンパイルし、4つの接続で試しました。すべてが期待どおりに機能しました。

+0

OS固有の問題である可能性があります。私はLinuxで試してみる。ありがとう – shubham003

関連する問題