服务器是c写的
客户端需要用java写
协议如下:
类型占一个字节
命令占一个字节
数值长度2个字节
版本号一个字节
保留3个字节
crc校验4个字节
然后是body
请问这个走tcpip协议怎么发送?
我该如何封装?
要怎么发送,怎么接受服务器返回的数据?
弄得简单点:
[code="java"]
byte[] body = bodyStr.getBytes();
byte[] data = new byte[body.length + 12];
data[0] = type;
data[1] = command;
// ...省略一大堆...
...
for (int i = 0; i < body.length; i++) {
data[i+12] = body[i];
}
Socket socket = new Socket("", 0);
OutputStream os = socket.getOutputStream().write(data);
os.flush();
os.close();
BufferedInputStream is = new BufferedInputStream(socket.getInputStream());
type = is.read();
command = is.read()
// ...省略一大堆...
...
is.close();
socket.close();
[/code]
没有涉及过,关注。
[quote]那些预留的几个字节怎么办?
服务器发送过来的是json格式的,我该怎么样接受?用不用写while循环了? [/quote]
预留的字节直接空掉就好:
[code="java"]
// data[5,6,7]直接跳过
data[4] = ?;
data[8] = ?;
[/code]
至于json的,直接把所有数据都用byte[]接收了,转换成字符串,再用json-lib处理。
[quote]
很感谢你,我是这样做的,但是总是得不到服务器返回的数据,每次就超时退出了,是不是服务器那边的原因?
[/quote]
这要和服务器那边的团队做协商,最好看看那边是不是收到了消息,解析有没有问题,结果是不是返回了等等。
原因可能有很多,比如字符串编码什么的,或者协议描述的数据格式是否正确、理解是否有误等等,还有网络是否畅通等等,要具体分析……
[quote]这样写应该没什么问题吧? [/quote]
数据结果返回是不是也遵循相同协议,如果是的话,要先read出协议栈的信息,里面有body长度,通过这个长度来new byte[],然后通过相同编码来转换字符串,这才是比较好的方式。
ps:你这个ByteArrayOutputStream干嘛要用byte[1024]来接收,直接read返回int接收不就行了?
用socket通信,有长短连接之分。你们用的哪种,
长连接 短连接 哪种更好,有代码的贴下啊
[quote]用socket通信,有长短连接之分。你们用的哪种,
长连接 短连接 哪种更好,有代码的贴下啊[/quote]
长短连接其实都行,这里直接new Socket()并在结束后关闭,那就是短连接,长连接可以考虑维护一个连接池(Socket池),两种情况不能简单地讲孰优孰劣,而是在不同情况下使用:比如一个server连接多个client基本上考虑短连接,而两个server间通讯可以考虑长连接。
建议使用NIO方式进行Socket通讯,其ByteBuffer对象用来处理这种协议最方便