从 Android 设备上的 Java 服务器获取响应

Posted

技术标签:

【中文标题】从 Android 设备上的 Java 服务器获取响应【英文标题】:Get Response from Java Server on android device 【发布时间】:2021-10-27 21:59:19 【问题描述】:

我正在从安卓手机向 Java 服务器发送一个请求,它在服务器端收到但无法在手机上得到响应 不知道为什么无法得到回复

下面是我的代码

private Socket client;
private PrintWriter printwriter;

class ClientThread implements Runnable 
    private final String message;

    ClientThread(String message) 
        this.message = message;
    
    @Override
    public void run() 
        try 
            // Creates a stream socket and connects it to the specified port number on the named host.
            client = new Socket("192.168.0.88", 8094);  // connect to server
            printwriter = new PrintWriter(client.getOutputStream(),true);
            printwriter.write(message);  // write the message to output stream
            Log.d("server request", message);
            printwriter.flush();
            printwriter.close();

            runOnUiThread(new Runnable() 
                @Override
                public void run() 
                    try 

                        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        StringBuilder sb = new StringBuilder();
                        String line = reader.readLine();
                        // Read Server Response
                        Log.d("server response", line);
                    
                     catch (Exception e)
                        e.printStackTrace();
                    
                
            );
            // closing the connection
            client.close();

         catch (IOException e) 
            e.printStackTrace();
        
    

【问题讨论】:

printwriter.close(); 不要这样做,因为它也会关闭套接字。 并且不要使用 runOnUiThread 从流中读取。所有互联网代码都应该在一个线程中完成。而且你已经在一个线程中.. 进一步你应该知道服务器正在发送什么。 服务器正在发送一个字符串作为确认 但是字符串并不总是一行,您使用 readLine() 所以让服务器发送一行。你为什么不调整你的代码呢? 【参考方案1】:

解决问题。在向服务器发送请求之前需要打开我的输入流

class ClientThread implements Runnable 
        private final String message;

        ClientThread(String message) 
            this.message = message;
        

        @Override
        public void run() 
            try 
                String fromServer;
                Socket socket = new Socket("192.168.0.2", 8094);
                Log.d("server connect", "Connected!");
                boolean run = true;

                while (run) 
                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    out.println(message);
                    fromServer = in.readLine();
                    Log.d("server resp", "received2: " + fromServer);
                    if (fromServer.equals("olleH")) 
                        out.println("Bye");
                    
                    socket.close();
                    in.close();
                    out.close();
                

             catch (
                    IOException e) 
                e.printStackTrace();
            
        
    

【讨论】:

在向服务器发送请求之前需要打开我的输入流...我不确定这意味着什么,但听起来不正确。此外,while(run) 中的代码似乎是一个无限循环。而且由于关闭套接字的输入流或输出流也会关闭套接字,因此将该代码置于循环中是没有意义的。 感谢他们有意义的建议

以上是关于从 Android 设备上的 Java 服务器获取响应的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 设备上的服务器向应用发送通知

(java, bluetooth-low energy, ble) 如何通过 BLE 从 android 设备获取数据

降低 Android 设备上的蓝牙信号强度

如何从浏览器获取本地存储在 Android 中的文件列表?

为啥 React Native 0.30 无法从 iPhone 设备上的开发服务器获取更改?

Android 应用程序在设备上显示列表,但从 Playstore 下载时