我无法在套接字连接中得到响应,我无法理解代码有什么问题。 我可以使用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()) {}
请帮我找到问题。我被严重困扰。请帮我解决问题
答案 0 :(得分:4)
对于套接字驱动的事件,当有一些(开源)库来实现这样的任务时,很难实现许多功能。考虑使用Socket.io。
Properties headers = new Properties();
headers.setProperty("Content-Type","application/json"); // your headers
SocketIO socketIO = SocketIO(url, headers);
有关详细信息,请查看SocketIO docs
修改强>
在您给出的示例中,您应该使用HttpURLConnection,因为您从服务器获得响应,您不需要实现套接字。只需GET
或POST
即可使用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();
}