Android java: как отправить сообщение с сервера конкретному клиенту в любое время

#java #android #client

#java #Android #клиент

Вопрос:

Я попытался отправить сообщение с сервера клиенту, но если я отправлю сообщение, клиенту необходимо снова подключиться или снова распечатать… Итак, как это работает? Я попытался снова распечатать сообщение с сервера на клиент, но клиент его не получит.

Итак, как отправить сообщение конкретному клиенту в любое время.

Сервер:

 package server.server.com;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;
import java.util.ArrayList;

public class Server extends Thread {
    private static ServerSocket serverSocket;
    public static Socket clientSocket;
    private static InputStreamReader inputStreamReader;
    private static BufferedReader bufferedReader;
    private static String message;
    static InputStream is;
    static OutputStream os;
    static byte[] buf;
    static BufferedReader reader;
    static BufferedWriter writer;
    static double ConsoleMessage;
    public static String output;
    static BufferedReader bufferedReader2;


    public static void main(String[] args) {

        try {
            serverSocket = new ServerSocket(12345);

        } catch (IOException e) {
            System.out.println("Could not listen on port: 12345");
        }

        System.out.println("Server started. Listening to the port 12345");

        while (true) {

            try {

                clientSocket = serverSocket.accept();
                inputStreamReader = new InputStreamReader(
                        clientSocket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader);


                PrintWriter out = new PrintWriter(
                        clientSocket.getOutputStream(), true);
                InputStream inputStream = new ByteArrayInputStream(
                        bufferedReader.readLine().getBytes(
                                Charset.forName("UTF-8")));
                bufferedReader2 = new BufferedReader(new InputStreamReader(
                        inputStream));
                output = bufferedReader2.readLine();
                System.out.println(output);

                out.flush();
                out.close();
                inputStreamReader.close();
                clientSocket.close();

            } catch (IOException ex) {
                System.out.println("Problem in message reading");
            }
        }

    }
}
  

Клиент:

   client = new Socket();
  client.connect(
      new InetSocketAddress(
         "IP-ADDRESS",
         PORT),
         5000);
   in = new BufferedReader(
   new InputStreamReader(
   client.getInputStream()));
       printlng = new PrintWriter(
           client.getOutputStream());
       printlng.println(mLongitude);
       printlng.flush();

       try {
           if ((Response = in
           .readLine()) != null) {

....
  

Ответ №1:

Вы должны взглянуть на http://developer.android.com/google/gcm/index.html . Возможно, вы могли бы воспользоваться преимуществами push-уведомлений в своем приложении.

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

1. В основном то, что я пытаюсь сделать, это всегда читать с сервера на клиенте.

2. GCM позволит вам отправлять сообщения с сервера на некоторые / все устройства, на которых установлено ваше приложение. Очень простой альтернативой является использование подхода веб-служб, но поскольку сервер не знает IP-адреса устройства, вам придется установить первый контакт с телефона, планшета или чего-то еще.

3. Но должен ли у меня быть этот графический интерфейс GCM и регистрация?

4. Привет @user3833732. Когда вы регистрируете свое устройство для получения push-уведомлений, вы получите один токен для идентификации этого телефона. Всякий раз, когда вы начинаете игру, вы должны хранить токены игроков, которые играют в шахматы. Всякий раз, когда один игрок делает ход, вы должны уведомить своего ASP.net приложение и ASP.net должен отвечать за отправку уведомления игроку, идентифицированному token2.

5. Невозможно избежать GCM / Webservice или, по крайней мере, я не знаю. Возможно, связь по Bluetooth или аналогичная, но вам нужно учитывать, что приложения для обмена сообщениями обычно работают таким образом, используя XMPP-сервер.

Ответ №2:

Может быть, вы можете сделать что-то вроде этого

Сервер:

 private boolean sendMessage(final String msg, final String dstIp, final int dstPort) {

    DatagramSocket sendSocket = null;

    try {
        sendSocket = new DatagramSocket();

        final InetAddress local = InetAddress.getByName(dstIp);
        final int msg_length = msg.length();
        final byte[] message1 = msg.getBytes();

        final DatagramPacket sendPacket = new DatagramPacket(message1,
                msg_length, local, dstPort);
        sendSocket.send(sendPacket);

    } catch (final Exception e) {
        e.printStackTrace();
        return false;
    } finally {

        if (sendSocket != null) {
            sendSocket.disconnect();
            sendSocket.close();
            sendSocket = null;
        }
    }
    return true;
}
  

Клиент:

 public static void receiveMessage() {

    if ((socket == null) || socket.isClosed()) {

            socket = new DatagramSocket(BROADCAST_PORT);
            socket.setSoTimeout(5000);

        } 

     try {
            idMsgs.clear();
            while ((socket != null) amp;amp; !socket.isClosed()) {
                socket.setReuseAddress(true);
                socket.setSoTimeout(10000);

                try {
                    final byte[] receiveBuffer = new byte[sizepck];
                    final DatagramPacket packet = new DatagramPacket(
                            receiveBuffer, receiveBuffer.length);

                    socket.receive(packet);

                } catch (final SocketTimeoutException e) {

                } catch (final Throwable e) {

                }
            }

        } catch (final Throwable e1) {

            try {
                Thread.sleep(TIME_RETRY);
            } catch (final InterruptedException e) {
                e.printStackTrace();
            }
        }

        finally {
            if (socket != null) {
                socket.close();
            }
        }

    }
  

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

1. Я предпочитаю TCP, и в основном то, что я пытаюсь сделать, это всегда читать с сервера на клиенте.