没有得到套接字连接的响应

时间:2017-04-04 04:13:03

标签: android json sockets

我无法在套接字连接中得到响应,我无法理解代码有什么问题。  我可以使用ip地址和端口号建立套接字连接,然后进入

url

当我尝试使用telnet时,我可以得到响应。但输入还有一些其他参数,如:

  

POST / setMap HTTP / 1.1   主持人:192.168.1.1   Content-Type:application / json;字符集= utf-8的   内容长度:1234

     

{“cmd”:“request_get_file_list”,“验证”:“CVS”}

我不知道如何在代码中包含内容类型,长度等连接属性。

以下是代码:

    if (nsocket.isConnected()) {} 

请帮我找到问题。我被严重困扰。请帮我解决问题

4 个答案:

答案 0 :(得分:4)

对于套接字驱动的事件,当有一些(开源)库来实现这样的任务时,很难实现许多功能。考虑使用Socket.io

Properties headers = new Properties();
headers.setProperty("Content-Type","application/json"); // your headers
SocketIO socketIO = SocketIO(url, headers);

有关详细信息,请查看SocketIO docs

修改

在您给出的示例中,您应该使用HttpURLConnection,因为您从服务器获得响应,您不需要实现套接字。只需GETPOST即可使用HttpURLConnection获取或推送您的数据。

答案 1 :(得分:4)

对于android中的套接字连接,你可以使用简单地实现套接字连接的this gist file

public SocketConnection(OnStatusChanged statusChangedListener, OnMessageReceived messageReceivedListener) {
        mStatusListener = statusChangedListener;
        mMessageListener = messageReceivedListener;

        isRunning = true;
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            mStatusListener.statusChanged(WAITING);
            socket = new Socket(serverAddr, SERVER_PORT);
            try {
                printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                mStatusListener.statusChanged(CONNECTED);
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while (isRunning) {
                    retrieveMessage = bufferedReader.readLine();
                    if (retrieveMessage != null && mMessageListener != null) {
                        mMessageListener.messageReceived(retrieveMessage);
                    }
                    else {
                        mStatusListener.statusChanged(DISCONNECTED);
                    }
                    retrieveMessage = null;
                }
            } catch (Exception e) {
                mStatusListener.statusChanged(ERROR);
            } finally {
                socket.close();
            }
        } catch (Exception e) {
            mStatusListener.statusChanged(ERROR);
        }
    }

<强>更新

如果您想设置自定义标头,只需将它们写入printWriter

写作时

writer.print ("GET " + szUrl + " HTTP/1.0\r\n\r\n"); 

\ r \ n \ r \ n位发送换行符/回车符以结束该行,然后发送另一行以指示没有更多标题。这是HTTP和电子邮件格式的标准,即空白行表示标题的结尾。为了添加额外的标题,您只需要在完成之前不发送该序列。您可以执行以下操作

writer.print ("GET " + szUrl + " HTTP/1.0\r\n"); 
writer.print ("header1: value1\r\n"); 
writer.print ("header2: value2\r\n"); 
writer.print ("header3: value3\r\n"); 
// end the header section
writer.print ("\r\n"); 

答案 2 :(得分:3)

代码可能卡在readLine()中,因为服务器仍在等待请求的完成。

您可以将其更改为:

// query
out.write("POST /setMap HTTP/1.1\r\n");
// headers
out.write("Host: 192.168.1.1\r\n");
out.write("Content-Type: application/json; charset=utf-8\r\n");
out.write("Content-Length: " + json.toString().getBytes(StandardCharsets.UTF_8).length + "\r\n");
// end of the headers
out.write("\r\n");
// body
out.write(json.toString());
// actually send the request
out.flush();

Log.i("Webservice", "json.toString"+json.toString());

我认为您使用了错误的工具来发出HTTP请求。套接字是低级网络通道,你必须自己做很多事情。

您应该考虑使用HttpURLConnection。如果可能,我强烈建议采用更高级别的方法,并使用类似retrofit2之类的东西。

答案 3 :(得分:0)

非常感谢您的每一个答案。所有的回答都引导我走向正确。我能够解决这个问题,这是代码。

               myClient = new Socket("192.168.1.1", 6666);

            try {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("cmd", "request_get_file_list");
                jsonObject.put("verification", "CVS");

                myClient.setKeepAlive(true);
                try {

                    DataInputStream dis = new DataInputStream(myClient.getInputStream());
                    DataOutputStream dos = new DataOutputStream(myClient.getOutputStream());

                    writer = new OutputStreamWriter(dos);//, StandardCharsets.UTF_8)
                    writer.write(jsonObject.toString());
                    System.out.println("c");
                    writer.flush();
                    dos.flush();

                    System.out.println("output buffer size:" + dos.size());
                    char c = (char) dis.read();
                    while (c != '\0') {
                        System.out.print(c);
                        str = str.append(c);

                        if (dis.available() != 0) {
                            c = (char) dis.read();
                        } else break;
                    }

                    dos.flush();
                    System.out.println("String:" + str.toString());
                    normalLoginResponse = str.toString();


                } catch (Exception e) {
                    e.printStackTrace();
                }