#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. Извините, я спрашиваю, что каждый клиент делегирован в другой поток со своим собственным экземпляром входных и выходных переменных? , спасибо, что дали мне знать!