Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓| can';t使用套接字向Wialon服务器发送/接收消息_Java_Android_Sockets_Client Server - Fatal编程技术网

Java 安卓| can';t使用套接字向Wialon服务器发送/接收消息

Java 安卓| can';t使用套接字向Wialon服务器发送/接收消息,java,android,sockets,client-server,Java,Android,Sockets,Client Server,首先,我知道这是一个非常普遍的问题,我已经浏览了几十种出版物和帖子。它们的解决方案基本相同。但经过几个小时的尝试,这对我仍然不起作用 问题在于发送/接收短信-我没有收到服务器的任何响应。它不是HTTP服务器,所以我使用套接字。我想可能有几个原因: 连接初始化问题 发送/接收消息的过程可能错误 也许我的建筑有点不对劲 现在输入代码。 初始/开放式套接字连接: private class OpenSocketTask extends AsyncTask<Void, Void, Void

首先,我知道这是一个非常普遍的问题,我已经浏览了几十种出版物和帖子。它们的解决方案基本相同。但经过几个小时的尝试,这对我仍然不起作用

问题在于发送/接收短信-我没有收到服务器的任何响应。它不是HTTP服务器,所以我使用套接字。我想可能有几个原因:

  • 连接初始化问题
  • 发送/接收消息的过程可能错误
  • 也许我的建筑有点不对劲 现在输入代码。

    初始/开放式套接字连接:

        private class OpenSocketTask extends AsyncTask<Void, Void, Void> {
    
        @Override
        protected Void doInBackground(Void... params) {
            try {
                // Creating InetAddress object from ipNumber passed via constructor from IpGetter class.
                InetAddress serverAddress = InetAddress.getByName(HOST); //also tried instead: socket = new Socket(HOST, PORT);
    
                // Create a new Socket instance and connect to host
                socket = new Socket(serverAddress, PORT);
                Log.i(TAG, "Socket created: " + HOST + ":" + PORT);
    
                // Create PrintWriter object for sending messages to server.
                // out = new PrintWriter(socket.getOutputStream(), true); //also tried this
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    
                //Create BufferedReader object for receiving messages from server.
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
                Log.d(TAG, "In/Out created");
    
            } catch (UnknownHostException e) {
                Log.e(TAG, "Don't know about host: " + HOST + ":" +PORT);
                connected = false;
                Log.e(TAG, e.getMessage());
            } catch (IOException e) {
                Log.e(TAG, "Couldn't get I/O for the connection to: " + HOST + ":" +PORT);
                connected = false;
                Log.e(TAG, e.getMessage());
            }
            connected = true;
            return null;
        }
    
        @Override
        protected void onPostExecute(Void result) {
            if (connected) {
                Log.d(TAG, "Connected to TCP server...");
            }
            super.onPostExecute(result);
        }
    }
    
    私有类OpenSocketTask扩展了异步任务{
    @凌驾
    受保护的Void doInBackground(Void…参数){
    试一试{
    //从IpGetter类通过构造函数传递的ipNumber创建InetAddress对象。
    InetAddress serverAddress=InetAddress.getByName(主机);//也尝试了:socket=new socket(主机,端口);
    //创建新的套接字实例并连接到主机
    套接字=新套接字(服务器地址、端口);
    Log.i(标记,“创建的套接字:“+HOST+”:“+PORT”);
    //创建用于向服务器发送消息的PrintWriter对象。
    //out=new PrintWriter(socket.getOutputStream(),true);//也尝试了此方法
    out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()),true);
    //创建用于从服务器接收消息的BufferedReader对象。
    in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
    Log.d(标记“已创建输入/输出”);
    }捕获(未知后异常e){
    Log.e(标记“不知道主机:“+host+”:“+PORT”);
    连接=错误;
    Log.e(标记,e.getMessage());
    }捕获(IOE异常){
    Log.e(标记“无法获取连接到:“+HOST+”:“+PORT”的I/O);
    连接=错误;
    Log.e(标记,e.getMessage());
    }
    连接=真;
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void结果){
    如果(已连接){
    Log.d(标记“已连接到TCP服务器…”);
    }
    super.onPostExecute(结果);
    }
    }
    
    发送和接收消息:

        public class ServerSendMessageTask extends AsyncTask<Void, Void, Void> {
        private String message;
    
        public ServerSendMessageTask(String message){
            this.message = message;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            if (connected) {
                Log.d(TAG, "Sending command to server: " + message);
                try {
                    out.println(message);
                    out.flush();
    
                    /**
                     * Alternative for SEND message
                     * Both didn't work.
                     * */
    //                    //Send the message to the server
    //                    OutputStream os = socket.getOutputStream();
    //                    OutputStreamWriter osw = new OutputStreamWriter(os);
    //                    BufferedWriter bw = new BufferedWriter(osw);
    //                    bw.write(message);
    //                    bw.flush();
    
                    Log.d(TAG, "Message was sent: " + message);
    
                    //Listen for the incoming messages while connected = true
                    while (connected) {
                        String incomingMessage = in.readLine();
                        if (incomingMessage != null) {
                            //never reach here :(
                            Log.d(TAG, "Received from server string: " + incomingMessage);
                        }
                    }
    
                    /**
                     * This is the alternative way to RECEIVE message
                     * Both didn't work for me
                     * */
    //                    //Get the return message from the server
    //                    InputStream is = socket.getInputStream();
    //                    InputStreamReader isr = new InputStreamReader(is);
    //                    BufferedReader br = new BufferedReader(isr);
    //                    String response = br.readLine();
    //                    Log.d(TAG, "Received from server string: " + response);
    
                } catch (UnknownHostException e) {
                    Log.e(TAG, "Don't know about host: " + HOST + ":" +PORT);
                    Log.e(TAG, e.getMessage());
                } catch (IOException e) {
                    Log.e(TAG, "Couldn't get I/O for the connection to: " + HOST + ":" +PORT);
                    Log.e(TAG, e.getMessage());
                }
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(Void res) {
            super.onPostExecute(res);
        }
    }
    
    公共类ServerSendMessageTask扩展了AsyncTask{
    私有字符串消息;
    公用服务器SendMessageTask(字符串消息){
    this.message=消息;
    }
    @凌驾
    受保护的void onPreExecute(){
    super.onPreExecute();
    }
    @凌驾
    受保护的Void doInBackground(Void…参数){
    如果(已连接){
    Log.d(标记“向服务器发送命令:”+消息);
    试一试{
    out.println(消息);
    out.flush();
    /**
    *发送消息的备选方案
    *两个都不起作用。
    * */
    ////将消息发送到服务器
    //OutputStream os=socket.getOutputStream();
    //OutputStreamWriter osw=新的OutputStreamWriter(os);
    //BufferedWriter bw=新的BufferedWriter(osw);
    //写(信息);
    //bw.flush();
    Log.d(标记“消息已发送:”+消息);
    //在连接时侦听传入消息=true
    同时(连接){
    字符串incomingMessage=in.readLine();
    if(incomingMessage!=null){
    //永远不要到达这里:(
    Log.d(标签,“从服务器接收的字符串:”+incomingMessage);
    }
    }
    /**
    *这是接收消息的另一种方式
    *这两个都不适合我
    * */
    ////从服务器获取返回消息
    //InputStream=socket.getInputStream();
    //InputStreamReader isr=新的InputStreamReader(is);
    //BufferedReader br=新的BufferedReader(isr);
    //字符串响应=br.readLine();
    //Log.d(标签,“从服务器接收的字符串:”+响应);
    }捕获(未知后异常e){
    Log.e(标记“不知道主机:“+host+”:“+PORT”);
    Log.e(标记,e.getMessage());
    }捕获(IOE异常){
    Log.e(标记“无法获取连接到:“+HOST+”:“+PORT”的I/O);
    Log.e(标记,e.getMessage());
    }
    }
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void res){
    super.onPostExecute(res);
    }
    }
    
    我在活动的
    onStart()
    中以
    new-OpenSocketTask().execute();
    的形式打开套接字,并在按钮上发送消息,使用code
    new-serversendmagestask(message.execute();
    。因此线程不会“重叠”

    另一件事可能是:

    我正在尝试将Ping包(参见第6页)发送到服务器。只是为了查看它的工作情况。它看起来像
    \p\r\n
    。因此,如果一切正常,我应该会收到此字符串:
    \AP\r\n

    Java的格式不太清楚,因此我尝试发送不同的消息组合:
    \p\r\n
    \p\35; \\ r\\n
    \p
    ,没有区别


    你能在这里指出我的错误吗?

    你没有告诉我到底发生了什么。那么我们怎么知道呢?
    然后点击按钮发送消息。
    。怎么猜?我们应该怎么猜?如果你这样初始化:
    String message=“\p\r”
    并使用带有
    out.println(message)
    的println writer,然后使用println()将添加\n以便wialon服务器将接收“#P#\r\n”。如果您想与我们联系