知道socket的大手们进

你好毒你好毒 2012-02-29 05:19:37
是这样的,我写了一个服务器是专门用来接数据的,差不多有30个客户端,客户端全是C++写的,我只负责服务器的开发,现在接发数据基本上正常,但是还是有问题。

问题如下:
1.客户端与服务器是长连接的,1秒给服务器一条数据如果30秒内没有往服务器发送数据服务器会自动把客户端断开,问题是客户端发送数据很正常的时候就莫名其妙的断开了,我服务器这边没有捕获到任何我自己打印的异常
2.服务器会每30秒向各个客户端回复一条确认消息,回复是很正常,但是回复的消息本来应该回复给A的,却莫名其妙的给了B。
3.客户端发送的数据过长的时候,比如有4000多个字节,服务器读消息有的读的消息是对的,有的读着读着就读成空字符了,比如:
A123|4101|15386|……省略N个字符|1|……此处省略的全是空字符|,用编辑器打开就是口子型的乱码 (4010表示消息长度)

这个问题困扰了我2个多月了,一直找不到问题的关键所在,到底是客户端的问题还是我服务器的问题,我也编写了客户端做过测试了,我自己编写的客户端只有问题2存在

希望有经验的大手门指点指点,到底是哪里的问题。
进一步解决问题可以联系我,我的邮箱297424058@qq.com,拜托!!
...全文
236 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小王爷 2012-03-03
  • 打赏
  • 举报
回复
服务器的我没弄过,写过一点点也只是客户端,对发给a的b却接受了的原因不清楚
小王爷 2012-03-03
  • 打赏
  • 举报
回复
是不是读输入流的问题呢,能把你读输入流的代码粘出来吗
侠龙 2012-03-03
  • 打赏
  • 举报
回复
我曾经 遇到过这个问题,对于 读取大包时出现空字符问题.也是java与C++联调时候出现的,后来用了一个方法解决。你的这个问题,应该是两边对socket流读写,没有异步而导致的。
小王爷 2012-03-01
  • 打赏
  • 举报
回复
有些数据类型需要转码的好像,字符串类型的也要转码,给你段代码你参考一下
public static String getString(byte[] b, int offset)
{
int i;
for(i = 0; i < (b.length - offset); i +=2)
{
if((b[offset+i] == 0)&&(b[offset+i+1] == 0))
break;
}
byte[] bTemp = new byte[i];
Arrays.fill(bTemp, (byte) 0);
System.arraycopy(b, offset, bTemp, 0, i);
Charset cs = Charset.forName ("UTF-16LE");
ByteBuffer bb = ByteBuffer.allocate(bTemp.length);
bb.put(bTemp);
bb.flip();
CharBuffer cb = cs.decode(bb);
return cb.toString();
}
如果不是这个问题那就可能是读输入流的问题。
你说发给A的消息被B接收了,具体我不清楚,但是我觉得消息包头应该有一个人员的标志位,即使B接收到了但是当B解析到消息不是发给他的,那也没必要读消息
安心逍遥 2012-03-01
  • 打赏
  • 举报
回复
楼上的真是不懂啊,哪能用GBK啊,晕死

要是C++跟java通信的话最好用ASCii码,这个不会出现乱码的

这个原理是网络的字节序不一样,特别是数字的
  • 打赏
  • 举报
回复
编码格式用GBK试试
你好毒你好毒 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yanglw_ahut 的回复:]

有些数据类型需要转码的好像,字符串类型的也要转码,给你段代码你参考一下
public static String getString(byte[] b, int offset)
{
int i;
for(i = 0; i < (b.length - offset); i +=2)
{
if((b[offset+i] == 0)&&(b[offset+i+1] == 0……
[/Quote]

回复消息给A却到B这个问题已经解决了,现在主要问题就是问题3了

你觉得出现问题的原因会有哪些,我相信我这边解析消息是绝对没问题的
你好毒你好毒 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yanglw_ahut 的回复:]
我前段时间写了个android的客户端的,服务器是C++做的,好像是有些东西要注意,晚上再看看
[/Quote]
谢谢
小王爷 2012-02-29
  • 打赏
  • 举报
回复
我前段时间写了个android的客户端的,服务器是C++做的,好像是有些东西要注意,晚上再看看
你好毒你好毒 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhaoqun890 的回复:]
建议把关键代码贴出来看看
[/Quote]

代码太多了,有兴趣的加我QQ帮找找原因,把整个工程发给你都没问题
zhaoqun890 2012-02-29
  • 打赏
  • 举报
回复
建议把关键代码贴出来看看

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧