如何用node.js实现客户端向服务器实时发送数据的功能
如何用nodejs实现客户端向服务器实时发送数据的功能
在数据层面,主要有:
Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的db概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。
Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。
document由多个field组成,不同的document里面同名的field一定具有相同的类型。document里面field可以重复出现,也就是一个field会有多个值,即multivalued。
Document type:为了查询需要,一个index可能会有多种document,也就是document type,但需要注意,不同document里面同名的field一定要是相同类型的。
Mapping:存储field的相关映射信息,不同document type会有不同的mapping。
我们定义发送者和接收者,发送者作为客户端,接收者作为服务端。
Senderjava
import javaioDataOutputStream;
import javaioIOException;
import javanetSocket;
import javautilArrays;
public class Sender {
public static void main(String[] args) throws Exception {
// 127001 代表本机地址,在 8888 端口上监听
Sender sender = new Sender("127001", 8888);
byte[] bytes = {15, 16, 17, 120}; // 对应的十六进制是 0F 10 11 78
sendersend(bytes);
Systemoutprintln("发送" + ArraystoString(bytes) + "完毕!");
}
private final String host;
private final int port;
public Sender(String host, int port) {
thishost = host;
thisport = port;
}
private void send(byte[] bytes) throws IOException {
Socket socket = new Socket(host, port); // 建立和服务端的 socket
try (DataOutputStream dos // 建立输出流
= new DataOutputStream(socketgetOutputStream())) {
doswrite(bytes, 0, byteslength); // 向输出流写入 bytes
}
}
}
Receiverjava
import javaioDataInputStream;
import javaioIOException;
import javanetServerSocket;
import javanetSocket;
public class Receiver {
public static void main(String[] args) throws Exception {
Receiver receiver = new Receiver(8888);
receiverreceive();
}
private final ServerSocket serverSocket;
public Receiver(int port) throws IOException {
serverSocket = new ServerSocket(port);
}
private void receive() throws IOException {
Systemoutprintln("等待客户端连接");
Socket socket = serverSocketaccept();
try (DataInputStream dis = new DataInputStream(socketgetInputStream())) {
byte[] bytes = new byte[1024]; // 假设发送的字节数不超过 1024 个
int size = disread(bytes); // size 是读取到的字节数
String hex = bytesToHex(bytes, 0, size);
Systemoutprintln("接收到的byte数组的十六进制:" + hex);
}
}
/
将 byte 数组转化为十六进制字符串
@param bytes byte[] 数组
@param begin 起始位置
@param end 结束位置
@return byte 数组的十六进制字符串表示
/
private String bytesToHex(byte[] bytes, int begin, int end) {
StringBuilder hexBuilder = new StringBuilder(2 (end - begin));
for (int i = begin; i < end; i++) {
hexBuilderappend(CharacterforDigit((bytes[i] & 0xF0) >> 4, 16)); // 转化高四位
hexBuilderappend(CharacterforDigit((bytes[i] & 0x0F), 16)); // 转化低四位
hexBuilderappend(' '); // 加一个空格将每个字节分隔开
}
return hexBuildertoString()toUpperCase();
}
}
运行,首先启动服务端:
然后启动客户端:
查看接收结果:
可使用android自带的httpclient框架实现。
1 GET 方式传递参数
//先将参数放入List,再对参数进行URL编码
List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
paramsadd(new BasicNameValuePair("param1", "数据")); //增加参数1
paramsadd(new BasicNameValuePair("param2", "value2"));//增加参数2
String param = URLEncodedUtilsformat(params, "UTF-8");//对参数编码
String baseUrl = "服务器接口完整URL";
HttpGet getMethod = new HttpGet(baseUrl + "" + param);//将URL与参数拼接
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse response = httpClientexecute(getMethod); //发起GET请求
Logi(TAG, "resCode = " + responsegetStatusLine()getStatusCode()); //获取响应码
Logi(TAG, "result = " + EntityUtilstoString(responsegetEntity(), "utf-8"));//获取服务器响应内容
} catch (ClientProtocolException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
2 POST方式 方式传递参数
//和GET方式一样,先将参数放入List
params = new LinkedList<BasicNameValuePair>();
paramsadd(new BasicNameValuePair("param1", "Post方法"));//增加参数1
paramsadd(new BasicNameValuePair("param2", "第二个参数"));//增加参数2
try {
HttpPost postMethod = new HttpPost(baseUrl);//创建一个post请求
postMethodsetEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中
HttpResponse response = httpClientexecute(postMethod); //执行POST方法
Logi(TAG, "resCode = " + responsegetStatusLine()getStatusCode()); //获取响应码
Logi(TAG, "result = " + EntityUtilstoString(responsegetEntity(), "utf-8")); //获取响应内容
} catch (UnsupportedEncodingException e) {
eprintStackTrace();
} catch (ClientProtocolException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
0条评论