Java 安卓TCP套接字没有';无法接收数据
我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask代码,用于发送消息并从PC接收回复:Java 安卓TCP套接字没有';无法接收数据,java,android,sockets,tcp,Java,Android,Sockets,Tcp,我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask代码,用于发送消息并从PC接收回复: public class Client extends AsyncTask<Void, Void, Void> { Context context; String dstAddress; int dstPort; String msg; Client(Context context, S
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();
}
});
}
因此,为了总结这些程序,android发送消息“android客户端”(服务器接收并在控制台上打印,没有问题),现在随着回复,服务器也发送“OK”,没有问题,但android端没有收到任何消息。
另外,正如我之前提到的,如果我删除
dout.close();
在我发送消息后,从android的asynctask,服务器只在程序终止时接收消息,我不明白为什么我必须关闭它才能成功发送消息。你在读行,但你没有发送行。向客户端发送的消息添加行终止符,或使用
BufferedWriter.newLine()
;和flush()
而不是关闭缓冲写入程序。请同时显示服务器代码。您不需要那只手!onPostExecute()中的er。您可以直接调用Toast()。dout.close()代码>。拆下那条线。它关闭套接字代码>。其他的类似。我们看不到客户端发送到服务器的内容。请在你的代码中添加。我们无法看到服务器发送给客户端的内容。但当客户试图阅读一行时,它应该是一行。它起作用了,非常感谢。我不必通过创建换行来关闭dout,以便服务器接收消息,因此套接字没有关闭。。导致android端的缓冲读取器读取回复。再次感谢,我不知道关闭缓冲读写器也会关闭套接字。
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"); }
}
}