2015-07-24 4 views
-1

Я пытаюсь сделать приложение для Android, которое может отправить сообщение на компьютер и получить его от него. Это довольно просто. Дело в том, что я сделал это через многоадресную рассылку, хотя и не совсем. Мое приложение может получать сообщения с компьютера (который использует приложение java, которое я сделал для приема и отправки сообщений). Но когда я пытаюсь отправить сообщение с устройства на компьютер, сообщение не поступает на компьютер. Я имею в виду, к приложению.Обмен сообщениями между Android и настольным компьютером

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

Настольное приложение работает на окнах.

Также, когда приложение Android получает сообщение, оно получает его следующим образом: «Сообщение 1» ... ", когда сообщение должно быть получено:« Сообщение 1 ». Я не знаю, может ли это быть актуальным.

код выглядит следующим образом: Класс

Сервер:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class MulticastSocketServer implements Runnable{ 

    final static String INET_ADDR = "224.0.0.3"; 
    final static int PORT = 8888; 
    static String msg; 

    public MulticastSocketServer(String message) throws UnknownHostException, InterruptedException { 
     msg = message; 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     // Get the address that we are going to connect to. 
     InetAddress addr = null; 
     try { 
      addr = InetAddress.getByName(INET_ADDR); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // Open a new DatagramSocket, which will be used to send the data. 
     try (DatagramSocket serverSocket = new DatagramSocket()) { 

      msg += "\\0"; 

      for (int i = 0; i < 10; i++) { 
       // Create a packet that will contain the data 
       // (in the form of bytes) and send it. 
       DatagramPacket msgPacket = new DatagramPacket(msg.getBytes(), 
         msg.getBytes().length, addr, PORT); 
       serverSocket.send(msgPacket); 

       System.out.println("Server sent packet with msg: " + msg); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      serverSocket.disconnect(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Client Класс:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.net.UnknownHostException; 
import java.util.Timer; 
import java.util.TimerTask; 

public class MulticastSocketClient implements Runnable { 

    final static String INET_ADDR = "224.0.0.3"; 
    final static int PORT = 8888; 
    Connection360 conn; 

    public MulticastSocketClient (Connection360 connection) throws UnknownHostException { 
     conn = connection; 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     try{ 
      // Get the address that we are going to connect to. 
      InetAddress address = InetAddress.getByName(INET_ADDR); 

      // Create a buffer of bytes, which will be used to store 
      // the incoming bytes containing the information from the server. 
      // Since the message is small here, 256 bytes should be enough. 
      byte[] buf = new byte[256]; 

      // Create a new Multicast socket (that will allow other sockets/programs 
      // to join it as well. 
      try (final MulticastSocket clientSocket = new MulticastSocket(PORT)){ 
       //Joint the Multicast group. 
       clientSocket.joinGroup(address); 

       System.out.println("Connected"); 

       //while (true) { 
        // Receive the information and print it. 
        DatagramPacket msgPacket = new DatagramPacket(buf, buf.length); 
        Timer timer = new Timer("tmr"); 
        timer.schedule(new TimerTask() { 
         @Override 
         public void run() { 
          clientSocket.disconnect(); 
         } 
        },10000); 
        clientSocket.receive(msgPacket); 

        String msg = new String(buf, 0, buf.length); 
        System.out.println("Socket 1 received msg: " + msg.substring(0, msg.indexOf("\\0"))); 
        conn.MessageReceived(msg.substring(0, msg.indexOf("\\0"))); 
        clientSocket.disconnect(); 
       //} 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      }catch (UnknownHostException ex){ 

      } 
    } 
} 

Это классы являются те, которые я сделал для настольного приложения. Классы, которые я сделал для Android-приложения, одинаковы, но мне пришлось изменить System.out.println() на Log.v(). Что касается остальных, то это точно так же.

Итак, если вы знаете, что может произойти, я бы очень признателен за вашу помощь в этой теме.

Спасибо!

+0

Могли бы мы хотя бы увидеть какой-нибудь код? –

+0

Да. Показать код. Это похоже на несовместимость кодирования. Попробуйте установить набор символов при отправке и получении в UTF-8 –

+0

Я добавил код. Простите за это. Я забыл о самой важной части. Я попробую установить кодировку, но я не знаю, будет ли она работать. Потому что сообщения даже не приходят к настольному приложению. Когда я отправляю сообщение, он ничего не отображает. Я не знаю, может ли быть проблема, вызванная кодировкой. Я проверю это, как только смогу. Спасибо за быстрый ответ – blastervla

ответ

0

Когда вы читаете входящий пакет, вы не используете его размер, но размер буфера вместо:

String msg = new String(buf, 0, buf.length); 
// should be: 
String msg = new String(buf, 0, msgPacket.getLength()); 
// or even better: 
String msg = new String(msgPacket.getData()); 

Если входящий пакет короче, остальная часть буфера содержит случайные данные, которые что ты получил. Строки Java не завершены NUL, поэтому msg.indexOf("\\0") не работает.

+0

Я изменю это сейчас. Спасибо! Я использовал'msg.indexOf ("\\ 0") ', чтобы обрезать сообщение сам, поскольку я не мог понять, что происходит. Рад, что вы помогли. Что касается проблемы с настольным приложением, есть ли у вас представление о том, что может произойти? – blastervla

+0

@blastervla Может быть, брандмауэр? – StenSoft

+0

Может быть. Я попробую и посмотрю, что я делаю. Благодаря! – blastervla