当前位置: 首页 > 知识库问答 >
问题:

Android TCP套接字不接收数据

终逸仙
2023-03-14

我使用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, 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的asynctask中,在我发送消息后,服务器只在程序终止时接收消息,我不明白为什么我必须关闭它才能成功发送消息。

共有1个答案

佘茂才
2023-03-14

你在读台词,但你没有发送台词。向客户端发送的消息添加行终止符,或者使用BufferedWriter.newLine();和flush()而不是关闭缓冲的写入器。

 类似资料:
  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 问题内容: 我正在建立一个客户-服务器项目。 我需要的是客户端发送一个字符串,例如“ Pendu”,服务器接收该字符串并将一个名为“ Pendu”的对象发送回客户端。 这是我的代码: 该类在包中定义: 我的问题是: 首先,我执行服务器,然后看到控制台中显示的内容。 然后我执行客户端,在控制台中,我收到如下消息: 同时,服务器端未显示任何新内容。 现在,我停止客户端,并显示服务器的所有其他消息: 当

  • 如何将数据从PHP页面发送到TCP端口? 我正在使用它,但我不能使用任何数据!还有,你知道我怎么才能暂停吗? 有什么问题?

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如