java - Android TCP 套接字不接收数据
问题描述
我正在使用 Android 应用程序通过 TCP 套接字与同一 LAN 上的 PC java 应用程序进行通信、发送和接收消息。下面是我在 android 中使用的 Asynctask 代码,用于发送消息并接收来自 PC 的回复:
public class Client extends AsyncTask<Void, Void, Void> {
Context context;
String dstAddress;
int dstPort;
String msg;
Client(Context context, String addr, int port, String msg) {
this.context = context;
dstAddress = addr;
dstPort = port;
this.msg = msg;
}
String reply = "";
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
BufferedWriter dout = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//send request
dout.write(msg);
dout.flush();
dout.close();
//get response
reply = br.readLine();
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// DISPLAY REPLY CONTENT
Handler handler = new Handler(context.getMainLooper());
handler.post( new Runnable(){
public void run(){
Toast.makeText(context, "Server reply: " + reply ,Toast.LENGTH_LONG).show();
}
});
}
}
- 我在 onPostExcecute 中显示 PC 的回复。
- Android 通过 BufferedWriter 发送消息,而 PC 上的 java 应用程序在 BufferedReader 中接收消息。(工作正常,经过测试)
- PC 收到消息后通过 BufferedWriter 向 android 发送响应,android 在 BufferedReader 中接收响应,如图所示:br.readLine()。(这里是问题):根据 PC 的应用程序调试,回复成功发送,没有任何 IOExceptions 或错误发生,但在 android 端回复字符串为空,看起来它什么也没收到。我真的不知道我做错了什么,希望有人能指出我所缺少的。
下面是处理客户端套接字的服务器线程,该线程基本上在 serversocket 接受套接字时运行:
static class clientThread extends Thread {
Socket s = null;
clientThread(Socket s) //constructor
{
this.s = s;
}
@Override
public void run ()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //receiving data into a buffered reader
String dataIn = br.readLine(); // reading the buffered data into a string
System.out.println("received: " + dataIn);
//BufferedWriter dout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//dout.write("OK");
//dout.newLine();
PrintWriter dout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
if(dataIn.equals("Android client"))
{
dout.println("OK");
dout.flush();
System.out.println("OK sent");
}
dout.close();
br.close();
s.close();
}
catch (IOException e)
{ System.out.println("Error occured"); }
}
}
所以总结程序,android发送消息“Android客户端”(服务器接收并在控制台上打印没有问题),现在有了回复,服务器发送“OK”也没有问题,但是android一方一无所获。另外,正如我之前提到的,如果我删除了 dout.close(); 在我发送消息后从android的异步任务中,服务器仅在程序终止时才收到消息,我不明白为什么我必须关闭它才能成功发送消息。
解决方案
您正在阅读线路,但您没有发送线路。在客户端发送的消息中添加行终止符,或者使用BufferedWriter.newLine()
; 而flush()
不是关闭缓冲的写入器。
推荐阅读
- javascript - 在 Ubuntu 操作系统中出现 node-gyp 和 node-sass 错误
- node.js - 有没有办法在后端 Nodejs 中处理付款?
- python - while 循环在下面的 python 代码中是如何工作的?
- c# - 有没有办法使用 SQL Server 在 ASP.NET 中获取 CurrentDate 并自动计算订阅的 EndDate?
- flutter - 安装flutter时出现Cocoapods错误如何解决?
- python - 在 AWS 上运行 cherrypy 应用程序:无法创建套接字
- bash - echo,printf 在作为命令运行时在脚本中不起作用
- javascript - 在 github 上部署 Angular 11 coreUI 基础应用
- video - FFMPEG - 流下载 + 调整大小 + HVEC 在一个语句中转换?
- python - 根据条件在熊猫数据框中插入一行