不好意思哈,UNIX下C语言客户端我不知道,只知道他与我之间定义的协议,他提交一个请求如:[010022345],我根据请求返回一个值如:[010122345 5436542 3232](变长)byte数组,结果他接受到[010122345 5436542 ],而3232就没收到了,服务器处理代码如下:try {
byte[] readBytes,writeBytes;
OutputStream outputToSocket = connection.getOutputStream();
InputStream inputFromSocket = connection.getInputStream();
BufferedInputStream in = new BufferedInputStream(inputFromSocket);
BufferedOutputStream out = new BufferedOutputStream(outputToSocket);
Request request = null;
Response response = null;
readBytes = new byte[9];
in.read(readBytes);//读取请求[010022345]
byte[] answer = buildCode();//得到返回数据[010122345 5436542 3232]
out.write(answer);//写入返回数据
out.flush();
out.close();
in.close();
} catch (Exception e) {
socketListener.getLog().write("error***处理当前连接时出现例外:"+e);
}
finally{
try{
connection.close();
connection = null;
} catch (Exception e){
System.out.println(e)
}
}
byte[] readBytes,writeBytes;
OutputStream outputToSocket = connection.getOutputStream();
InputStream inputFromSocket = connection.getInputStream();
BufferedInputStream in = new BufferedInputStream(inputFromSocket);
BufferedOutputStream out = new BufferedOutputStream(outputToSocket);
Request request = null;
Response response = null;
readBytes = new byte[9];
in.read(readBytes);//读取请求[010022345]
byte[] answer = buildCode();//得到返回数据[010122345 5436542 3232]
out.write(answer);//写入返回数据
out.flush();
out.close();
in.close();
} catch (Exception e) {
socketListener.getLog().write("error***处理当前连接时出现例外:"+e);
}
finally{
try{
connection.close();
connection = null;
} catch (Exception e){
System.out.println(e)
}
}
解决方案 »
- 大家好,我的程序log4j打不出日志报这个错是什么原因哦,我查不出来哦,帮帮忙啊
- 几个答案用JAVA代码怎么实现呢?
- java 文件下载 怎么提升速度?
- Weblogic9下链接informix时,出现statement cache异常!
- [Appfuse]中通过DWR验证登陆身份
- Struts框架中,跳转页面问题
- 有没有人有使用切面编程的例子
- 我有1.6亿条文本纪录1,另外有40万条的文本纪录2,我要看不在1中的2的纪录,数据量较大,如何处理?jvm 的大小如何设置?
- 一个愚蠢的问题,请大家帮忙!(分数不多请别见怪)
- rabbitmq 手动取消消费者注册报错:java.io.IOException: Unknown consumerTag
- [100分]清jFresH_MaN()(AbsolutelyFresh)进接分,其余免进
- [100分2]清jFresH_MaN()(AbsolutelyFresh)进接分,其余免进
如果是的,那可能是通讯中的字符串丢失了
问题可能找到了,但我不知道如何解决,c客户端没有使用流机制,在接收到一个数据包后就认为当前socket通信结束。
我如何才能使我的socket在out.write(answer)时只产生一个数据包啊?
sock.setSendBufferSize来看看,但是应该说是C方面存在问题的。
sock.getSendBufferSize()出来是8k应该没问题,我现在在看是不是:
BufferedOutputStream out = new BufferedOutputStream(outputToSocket);的原因
BufferedOutputStream默认的size是512,我打算换成:
BufferedOutputStream out = new BufferedOutputStream(outputToSocket,8192);
同时请校验2端的编码方式是否一样,但是看起来这个应该没有什么问题,因为你只是用到byte[]。
看看c代码是如何获取数据的,因为c中的0会被认为字符串结束符的。所以最好只要以byte操作比较好。
byte[] answer = buildCode();//得到返回数据[010122345 5436542 3232]
是不是确实如你所说的数据,你那些[xxx xxx xxx]里的x到底是什么进制的值?
其实这个就是你们c-java之间的应用曾协议的问题。如果你传了一个byte[],但是c端以字符串的方式接受当然就不对了,一定要做到encoder/decoder是可逆的。btw,你的32如果是10进制标示的ASCII的话,那可就是“空格”哦。
这里要再次感谢takecare(大厅)、ChDw(米)、zedk928(其实我是一个卧底!) ,:)