从 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 服务器获取响应的主要内容,如果未能解决你的问题,请参考以下文章
(java, bluetooth-low energy, ble) 如何通过 BLE 从 android 设备获取数据