【问题标题】:Get Response from Java Server on android device从 Android 设备上的 Java 服务器获取响应
【发布时间】: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() 所以让服务器发送一行。你为什么不调整你的代码呢?

标签: java android sockets server


【解决方案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){ 中的代码似乎是一个无限循环。而且由于关闭套接字的输入流或输出流也会关闭套接字,因此将该代码置于循环中是没有意义的。
  • 感谢他们有意义的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2016-10-08
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多