【问题标题】:Android TCP Client can not receive data from TCP Server with wifiAndroid TCP Client 无法通过 wifi 接收来自 TCP Server 的数据
【发布时间】:2013-09-16 07:49:53
【问题描述】:

我在计算机和带有 wifi 模块的安卓设备之间发送/接收数据时遇到问题。我的电脑可以发送/接收来自 android 的数据,但 android 设备无法从电脑接收数据,它只能发送什么问题? 我将计算机设置为 TCP Server,而 android 是 TCP Client。 我认为它在 DataInputStrem 中出错,但我不知道如何解决它。

public class TCPClient {

    private String serverMessage;
    public static final String SERVERIP = "192.168.0.1"; //your computer IP address
    public static final int SERVERPORT = 6000;
    private OnMessageReceived mMessageListener = null;
    private boolean mRun = false;

    DataOutputStream out;
    DataInputStream in;

    /**
     *  Constructor of the class. OnMessagedReceived listens for the messages received from server
     */
    public TCPClient(OnMessageReceived listener) {
        mMessageListener = listener;
    }

    /**
     * Sends the message entered by client to the server
     * @param message text entered by client
     */
    public void sendMessage(String message){
        if (out != null) {
            try {
                out.writeUTF(message);
                out.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    public void stopClient(){
        mRun = false;
    }

    public void run() {

        mRun = true;

        try {
            //here you must put your computer's IP address.
            InetAddress serverAddr = InetAddress.getByName(SERVERIP);

            Log.e("TCP Client", "C: Connecting...");

            //create a socket to make the connection with the server
            Socket socket = new Socket(serverAddr, SERVERPORT);

            try {
                //send the message to the server
                out = new DataOutputStream(socket.getOutputStream());
                Log.e("TCP Client", "C: Sent.");
                Log.e("TCP Client", "C: Done.");

                //receive the message which the server sends back
                in = new DataInputStream(socket.getInputStream());
                Log.e("TCP Client x", in.readUTF());
                //in this while the client listens for the messages sent by the server
                while (mRun) {
                    serverMessage = in.readUTF();
                    if (serverMessage != null && mMessageListener != null) {
                        //call the method messageReceived from MyActivity class
                        mMessageListener.messageReceived(serverMessage);
                    }
                    serverMessage = null;
                }
                Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");

            } catch (Exception e) {

                Log.e("TCP", "S: Error", e);

            } finally {
                //the socket must be closed. It is not possible to reconnect to this socket
                // after it is closed, which means a new socket instance has to be created.
                socket.close();
            }

        } catch (Exception e) {

            Log.e("TCP", "C: Error", e);

        }

    }
    //Declare the interface.
    //class at on asynckTask doInBackground
    public interface OnMessageReceived {
        public void messageReceived(String message);
    }
}

【问题讨论】:

  • 您是否有合理的理由允许mListener 成为null
  • in.readUTF() 永远无法返回null,你也不需要null 它。
  • 如果你不创建mRun volatile 则不能保证它会看到另一个线程设置它。 vanillajava.blogspot.de/2012/01/…vanillajava.blogspot.de/2013/01/…
  • 如果您可以将field 设为局部变量,您应该这样做。我会在循环内声明String serverMessage,而不是作为字段。
  • 您不需要检查永远不会发生的值。你需要考虑我给你的每一点。从问题中给出的详细信息来看,您似乎没有发送消息,因为您实际上并没有在任何地方调用 sendMessage 。我无法解释你为什么不这样做。

标签: java android tcpclient


【解决方案1】:

感谢大家的回答,很抱歉这个问题不清楚。我的项目是通过我的电子板连接Android设备和电子板,包括wifi模块“HLKM03”。我通过

测试连接

1 我看到客户端(Android)使用 TCPClient 应用程序发送/接收数据。和
2 我在服务器端(电子板+ Wifi 接入点)看到数据发送/接收,所以我通过此解决方案“wifi+电子板--> usb2RS232--> 计算机(docklight 程序)”检查数据传输。 来自所有。现在我可以通过更改此代码来解决我所有的问题

 try {
            //send the message to the server
            out = new DataOutputStream(socket.getOutputStream());
            Log.e("TCP Client", "C: Sent.");
            Log.e("TCP Client", "C: Done.");

            //receive the message which the server sends back
            in = new DataInputStream(socket.getInputStream());
            //Log.e("TCP Client x", in.readUTF());
            //in this while the client listens for the messages sent by the server
            while (mRun) {
                //serverMessage = in.readUTF();
                //TCPClient localClientActivity = TCPClient.this;
                int j = in.read(buffer);
                serverMessage = bytesToHexString(buffer, j);

                if (serverMessage != null && mMessageListener != null) {
                    //call the method messageReceived from MyActivity class
                    mMessageListener.messageReceived(serverMessage);
                }
                serverMessage = null;
            }
            Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");

        } catch (Exception e) {

            Log.e("TCP", "S: Error", e);

        } finally {
            //the socket must be closed. It is not possible to reconnect to this socket
            // after it is closed, which means a new socket instance has to be created.
            socket.close();
        }

并添加函数 chage bytetoHexString 用于转换数据从服务器接收数据。它可以帮助我的 android 已经从我的电子板上接收数据。再次感谢。

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 2012-06-09
    • 2012-09-27
    • 2014-10-13
    • 2014-12-30
    • 2012-07-15
    • 2020-06-22
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多