Java Android和桌面之间的消息传递

Java Android和桌面之间的消息传递,java,android,sockets,desktop-application,multicastsocket,Java,Android,Sockets,Desktop Application,Multicastsocket,我正在尝试制作一个Android应用程序,它能够向计算机发送消息并从计算机接收消息。这很基本。问题是,我已经通过多播实现了这一点,尽管不完全是这样。我的应用程序能够从计算机接收消息(它使用我制作的java应用程序来接收和发送消息)。但是,当我尝试从设备向计算机发送消息时,消息没有到达计算机。我的意思是,申请表 桌面应用程序和Android应用程序都使用相同的客户机-服务器类。这就是让我如此困惑的原因。因为,当我使用相同的类时,为什么它以一种方式工作,而不是另一种方式?我只是不知道不 桌面应用程序

我正在尝试制作一个Android应用程序,它能够向计算机发送消息并从计算机接收消息。这很基本。问题是,我已经通过多播实现了这一点,尽管不完全是这样。我的应用程序能够从计算机接收消息(它使用我制作的java应用程序来接收和发送消息)。但是,当我尝试从设备向计算机发送消息时,消息没有到达计算机。我的意思是,申请表

桌面应用程序和Android应用程序都使用相同的客户机-服务器类。这就是让我如此困惑的原因。因为,当我使用相同的类时,为什么它以一种方式工作,而不是另一种方式?我只是不知道不

桌面应用程序在windows上运行

此外,当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();
        }
    }
}
这些类是我为桌面应用程序创建的类。我为Android应用程序创建的类是相同的,但我必须将
System.out.println()
更改为
Log.v()
。至于其余的,它们完全相同

所以,如果你碰巧知道会发生什么,我将非常感谢你在这个话题上的帮助


谢谢!

当您读取传入数据包时,您不使用其大小,而是使用缓冲区的大小:

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”)
不起作用。

我们至少可以看到一些代码吗?是的。显示一些代码。这似乎是编码不兼容。请尝试在发送和接收到UTF-8时设置字符集。我已经添加了代码。很抱歉,我忘记了最重要的部分。我将尝试设置编码,但我不知道它是否起作用。因为消息不起作用“甚至没有到达桌面应用程序。当我发送消息时,它根本不显示任何内容。我不知道这是否仍然可能是编码引起的问题。我会尽快检查。感谢您的快速响应。我现在将更改它。谢谢!我使用了”“msg.indexOf”“\\0”“。”''这样我就可以自己删减邮件了,因为我不知道发生了什么。很高兴你帮了忙。关于桌面应用程序的问题,你知道会发生什么吗?@blastervla可能是防火墙?可能。我会试试看我能做些什么。谢谢!好的。是防火墙阻止了连接。我已经设置了我的windows手动设置防火墙以允许通信。但是,如果要安装我的程序,您知道我如何以编程方式设置此程序吗?或者,例如,在安装时请求许可?感谢您所做的一切!
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());