Трансляция TCP-сервера Android

Я разрабатываю приложение для Android, которое использует TCP для подключения устройства. Проблема в том, что я новичок в программировании сокетов. Я успешно сделал серверный и клиентский код. Каждый клиент может подключиться к серверу, и сервер может ответить клиенту. Но я не могу заставить сервер отправлять сообщения всем подключенным клиентам одновременно. Каковы шаги, чтобы заставить сервер транслировать сообщение клиенту? Это код сервера:

ServerSocket server = null;
try {
    server = new ServerSocket(9092); // start listening on the port
} catch (IOException e) {
    Log.d("btnCreate onClick", "Could not listen on port: 9092");
}
Socket client = null;
while(true) {
    try {
        client = server.accept();
    } catch (IOException e) {
        Log.d("btnCreate onClick", "Accept Failed");
    }
    //start a new thread to handle this client
    Thread t = new Thread(new ClientConn(client));
    t.start();
}

И поток сервера:

class ClientConn implements Runnable {
    private Socket client;

    ClientConn(Socket client) {
        this.client = client;
    }

    public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            /* obtain an input stream to this client ... */
            in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
            /* ... and an output stream to the same client */
            out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        String msg;
        try {
            while ((msg = in.readLine()) != null) {
                Log.d("ClientConn", "Client says: " + msg);
                out.println(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

person Hanny Udayana    schedule 14.10.2012    source источник
comment
Можете ли вы объяснить, что вы подразумеваете под трансляцией в вашем контексте? TCP не имеет широковещательной передачи.   -  person Greg Hewgill    schedule 14.10.2012
comment
Отредактировал мой вопрос. Я хотел бы, чтобы сервер отправлял сообщение всем подключенным клиентам. Разве это не называется трансляцией? Я новичок в программировании сокетов.   -  person Hanny Udayana    schedule 14.10.2012


Ответы (1)


TCP — это протокол соединения точка-точка. Это означает, что когда вы отправляете сообщение через сокет, оно отправляется только одному получателю. Другие IP-протоколы, такие как UDP, имеют «широковещательный» режим, в котором один пакет может передаваться нескольким получателям, но для TCP такого не существует.

Чтобы ваш сервер отправлял одно и то же сообщение всем клиентам, сервер должен отправлять одно сообщение на каждый сокет для каждого клиента.

person Greg Hewgill    schedule 14.10.2012
comment
Итак, я должен хранить IP-адреса всех моих клиентов, а затем отправлять сообщения всем им по одному? Куда мне вставить код? На клиентконне? - person Hanny Udayana; 14.10.2012
comment
У вас уже есть дескриптор открытого сокета для каждого клиента в соответствии с опубликованным вами кодом (в ClientConn). Так что вам просто нужно каким-то образом сообщить этому классу, чтобы он отправил сообщение в его сокет client. - person Greg Hewgill; 14.10.2012
comment
Хорошо, я постараюсь и дам вам знать. Спасибо за просветление. :D - person Hanny Udayana; 14.10.2012