正在从 Android 客户端向 Java 服务器发送消息

Sending message from Android client to Java server

我正在开发一个 Android 应用程序,我需要从该应用程序向 Java 服务器发送消息。

Java 服务器是这样工作的:

thread = new Thread(){
            public void run(){

                System.out.println("Server is running...");

                try {
                    ServerSocket socket = new ServerSocket(7000);
                    while(true){
                        Socket s = socket.accept();
                        DataInputStream dis = new DataInputStream(s.getInputStream());
                        System.out.println("Received from client: " + dis.readUTF());
                        dis.close();
                        s.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        };
        thread.start();

在我的应用程序中,我以这种方式发送消息:

mt = new Thread() {
            public void run() {

                try {
                    Socket socket = new Socket("192.168.1.100", 7000);
                    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                    dos.writeUTF(song_field.getText().toString());
                    dos.flush();
                    dos.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        };
        mt.start();
        Toast.makeText(context, "Your Message is sent. Thank you!", Toast.LENGTH_SHORT).show();

我可以用模拟器和我的 phone 成功发送消息,因为它们连接到同一个 wifi 连接,但是如果设备没有连接到同一个网络,则消息不会发送到服务器.我希望每个人都能够向我的计算机服务器发送消息,无论他们的互联网连接如何。

我该如何解决这个问题?

一般来说,您需要使用 Web Sockets 之类的东西来实现您想要做的事情,通常情况下,client/server 位于不同的网络上。有几种不同的 Web Socket 实现,例如https://medium.com/square-corner-blog/web-sockets-now-shipping-in-okhttp-3-5-463a9eec82d1#.w9hrc1icw

编辑 我最初误读了问题并认为您正在尝试从服务器向客户端异步发送消息(这需要类似 Web Sockets 的东西)。如果您只是从客户端向服务器发出请求,那么典型的解决方案是从您的服务器公开 REST API(并使用类似 Retrofit 的东西从客户端发出请求)。