Фон
Я создаю сервер чата с помощью Golang.Каждый раз, когда клиент подключается к серверу, я запускаю функцию Client как новый поток, так что каждый клиент получает поток, который прослушивается.Мне удалось создать простое соединение клиент-сервер на основе этого учебника , но сейчас я пытаюсь создать соединения для нескольких клиентов, чтобы они могли отправлять сообщения в чаты.
Объяснение кода
Следуя этого урока , похоже, что я могу создать поток с помощью go func()
и ждать установления соединения, включая канал (<-newClient
).Я передаю значение bool в канал перед вызовом пользовательской функции, потому что пользовательская функция будет работать вечно, и я хочу установить другие клиентские подключения.Для каждого клиентского соединения будет работать пользовательская функция.
Проблема
Я не знаю, как передать переменную пользовательского соединения другим моим функциям.Я помещаю conn net
в аргументы для своих функций, но это просто заполнитель, потому что я не уверен, как это сделать.
Кроме того, мой go func()
с вызовом пользователя() после реализации канала моя лучшая попытка многопоточности, но я не уверен, что думаю об этом правильно.
Server.go
package main
import (
"net"
"fmt"
"bufio"
"strings"
"container/list"
"time"
)
type chatRoom struct {
name string
messages list.List
users list.List
lastUsed time.Time
}
var chatRooms *list.List //A list of chatrooms where each client can post messages, where messages can be seen by all clients in the chatroom
var conn net.Conn
func user(conn net) {
for {
message, _ := bufio.NewReader(conn).ReadString('\n') // will listen for message to process ending in newline (\n)
fmt.Print("Message Received:", string(message)) // output message received
s := strings.Split(string(message), ":")
if strings.Compare(s[0],"create") == 0{ //create a chat room
create(conn, s[1])
}else if strings.Compare(s[0],"list") == 0 { //List the current chatrooms
msg = listRooms(conn)
}else if strings.Compare(s[0],"join") == 0 { //Join the user to a chat room
join(conn, s[1])
}else if strings.Compare(s[0],"leave") == 0 { //Remove the user from a chatroom
leave(conn, s[1])
}else if strings.Compare(s[0],"message") == 0{ //Send a message to a chatroom
message(conn, s[1], s[2])
}
}
}
func main() {
fmt.Println("Launching server...")
this.userList = list.New()
this.chatRooms = list.New();
ln, _ := net.Listen("tcp", ":8081") // listen on all interfaces
conn, _ := ln.Accept() // accept connection on port
for { // run loop forever (or until ctrl-c)
go func(){
newClient := make(chan bool)
ln, _ := net.Listen("tcp", ":8081") // listen on all interfaces
conn, _ := ln.Accept() // accept connection on port
newClient <- true
user(conn)
}
<-newClient
}
}