java socket c++通信

忧郁麦芽 发布于 2016/10/11 16:20
阅读 296
收藏 1

我这边做一个uas,使用java  通过socket 链接c++的服务器。

简单示例代码

Socket socket=new Socket("111.161.150.171",111);

PrintWriter write = new PrintWriter(socket.getOutputStream());

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String mes = in.readLine();

//使用这 readLine()这个方法读取数据时 由于服务器端 tcp通信没有换行符这一说 使用此方法读取数据一直无法读取到 直到服务器端超时断开链接 我才收到信息

后来我根据位数, 

 InputStream input = socket.getInputStream();

            byte[] b = new byte[666];

            input.read(b);

这样可以正常读取到 发送过来的字节流 byte数组b中的值是对的,但是我使用

write.println(b);
   write.flush();
进行转发的时候转发失败

我调查了不少时间,一直没啥头绪。有没有有过类似经历的给点信息


加载中
0
GestureWei
GestureWei
仍然直接用OutputStream,PrintWriter和BufferedReader都是基于字符流的Reader,而你这个场景应该直接用字节流
GestureWei
GestureWei
回复 @忧郁麦芽 : 数据协议这种东西实际上就是双方协商过后的特定数据格式,很多基于TCP的协议都是这样处理的,例如HTTP,数据头部分是文本,以\r\n作为每个字段的分隔,Content-Length字段指明数据体的长度。如果没有特殊需求,可以考虑运用现有的,比如thrift,既有数据组织,也有相关C/S端实现,还有protobuf,这个就仅仅是数据组织的方式了
忧郁麦芽
忧郁麦芽
回复 @GestureWei : 恩 是的 只是双方 商量好的一个规则。java这边是用流读取,假如我使用流读出来的数据是服务器发过来的N条信息,我只能从头开始,先读取长度 然后确定这一条的长度,根据这个长度处理完这一条后 在读取下一个长度。总感觉这样有点麻烦。。.
忧郁麦芽
忧郁麦芽
回复 @GestureWei : 对,只能通过传递数据长度了啊 我还寻思有别的方法。。。
GestureWei
GestureWei
回复 @554330833a : 在包中写入数据长度,或者设置结尾标志,这也跟语言没有关系,属于协议设计的范畴
554330833a
554330833a
粘包在java下怎么解决?
下一页
0
kakai
kakai
如果涉及到基本数据类型,记得Java默认是大字节序,C++默认是小字节序的
忧郁麦芽
忧郁麦芽
恩 我也研究了下字节序,主机字节序和网络字节序还是有区别的 java的都一样 c++的根据cpu不一样系统不一样 都会有区别。网络字节序就是一种低地址高位,高地址低位。
GestureWei
GestureWei
回复 @BoXuan : 也是共同学习哈,相互提个醒
kakai
kakai
回复 @GestureWei : 这个我认同,先前我片面的说C++是小字节序的确不正确
GestureWei
GestureWei
回复 @BoXuan : 我只是说明一下“C++是小端序”这句话,是不正确的,字节序与语言没有关系,跟平台有关系,x86是小端序,jvm是大端序;网络通信约定使用大端序
kakai
kakai
回复 @GestureWei : 一般情况,java跟C/C++网络通信都要明确指明一方的字节序跟另一方相同,java的跨平台性,它的字节序默认都是高字节序,C/C++本地字节序跟CPU相关,所以一般是强制把C/C++这边设置为大字节序的。
下一页
0
kakai
kakai
我记得java的readLine是以\r\n作为分隔符的,如果你用字符流,可以在服务器端发送数据的时候强制写入\r\n两个字节,如果加了这两个字节作为一行数据的结束符,java的readLine好像内部是做了粘包解码的,每次读取一行数据。java的println输出一行数据是加了\r\n的,C++服务器也要能正确解析出一行数据,如果没有现成的,那么在服务器端你就要自行实现粘包解码了。明确一点,字符流其实就是特殊的字节流,其本质仍是字节流。
忧郁麦芽
忧郁麦芽
对的 开始用readLine就是因为缺少换行符 所以无法读取到数据,服务器那边不能加这个东西 那我只能换方式了,直接读取固定长度的字符。
返回顶部
顶部