Android Kotlin — сервер сокетов для обработки нескольких клиентов

#android #sockets #kotlin

#Android #сокеты #kotlin

Вопрос:

Я создаю музыкальную игру для сокетов, используя Kotlin в Android, прямо сейчас у меня есть работающее приложение 1 на 1, которое делает все, что я хочу, но я хочу иметь возможность поддерживать несколько клиентов (максимум 4), как мне следует реорганизовать свой код для этого? , должен ли я использоватьсопрограммы или потоки? сервер отправляет песню каждому клиенту каждые 30 секунд, поэтому в идеале мне бы хотелось, чтобы один и тот же способ отправки одного и того же сообщения каждому клиенту с небольшой задержкой

Сервер

                     val server = ServerSocket(6000)
                    Log.i("Server","Opening Connection on ${server.localPort}")
                    val client = server.accept()
                    Log.i("Server","Client Connected")
                    output = PrintWriter(client.getOutputStream(), true)
                    var input = BufferedReader(InputStreamReader(client.inputStream))


                    output.println(j_song.toString())

                   
                    // Sending each song in a playlist to all clients
                    for(i in songs)
                    {
                        val send_song = Gson().toJson(i)
                        output.println(send_song)
                        val status = input.readLine()
                         // Other functionality

                        }
 

Клиент

 GlobalScope.launch {
           socket = Socket("10.0.2.2", 5000)
           output = PrintWriter(socket.getOutputStream(), true)
           input = BufferedReader(InputStreamReader(socket.getInputStream()))
           Log.i("Client Connected", "Connected to Server ${socket.inetAddress.hostAddress}")
           val mes = input.readLine()
           Log.i("Client", mes)

           val songs = JSONArray(mes)
           Log.i("Client (JSON LIST)", songs.toString())

         
           
           var server_song : String
           while(true)
           {

                server_song = input.readLine()
                output.println(status)
}
}

 

Любая помощь будет высоко оценена!

Комментарии:

1. val client = server.accept() После этого оператора вы должны запустить поток, который обрабатывает этот клиент. Затем снова вызовите accept() в цикле. Выходные и входные переменные должны быть частными для клиентского потока.

2. Спасибо за вашу помощь, могу ли я получить доступ к выходным и входным переменным с сервера для записи каждому клиенту?

3. Я не понимаю вашего вопроса. Сервер создает поток для каждого клиента. И для каждого клиента есть вход и выход, приватные для потока. Единственный, который использует выходы и входы, — это сервер. Кто еще? Поместите весь код после server.accept() в поток для клиентов.

4. Log.i("Server","Opening Connection on ${server.localPort}") Неверное сообщение. Сервер не может установить соединение. Сервер начинает прослушивать подключение клиента.

5. Извините, я спрашиваю, что каждый клиент делегирован в другой поток со своим собственным экземпляром входных и выходных переменных? , спасибо, что дали мне знать!