【高分求救】关于一个socket客户端程序的错误----求教高手!

qizi168 2005-10-18 07:42:33
我写了一个客户端 发送一个16进制的命令字符串到服务器,服务器做出一定处理返回给我一个字符串
可是现在情况是:如果我发送字符串格式符合要求,返回的就是“message length error”;如果格式不对,程序就死在read()这里了,请教大虾 帮我看看这个程序 在线等待~~
程序中如果有什么明显是新手做法的地方 也请指教更好的做法!
protected Socket socket;
protected InputStream in;
protected OutputStream out ;

protected String cmd="W21K0001DFB4524F78948341000531106039989;010120041014075300-L02;2004-06-25;28347.65";
String outStr = new String();

public Decoder(){
try{
if(getConn()){
System.out.println("connected");
int iSize=cmd.length(); //取得发送字符串长度
char[] inputChar=new char[iSize+2] ;
tools.intC(inputChar,iSize); //字符串长度高低位反转 以2个字符的形式写入数组前2个位置

cmd.getChars(0,iSize,inputChar,2);//将发送字符串以字符形式写入char数组
out =socket.getOutputStream();
in = socket.getInputStream();

InputStreamReader iw = new InputStreamReader(in);
BufferedReader br=new BufferedReader(iw);
OutputStreamWriter ow = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(ow,inputChar.length);//指定发送缓冲区长度
//发送
for(int i=0;i<inputChar.length;i++){
bw.write(inputChar[i]);
};
bw.flush();
String userInput;
System.out.println("--读取数据中--");

//读取
int num=tools.returnNum(br.read(),br.read());//读接受到的前2个字符 转化为1个整数
socket.setReceiveBufferSize(num); //用来判断接受到的消息长度

char[] rs= new char[num];
br.read(rs,0,num);
for(int i=0;i<num;i++){
outStr+=rs[i];
}
System.out.print("--返回数据为--"+outStr);
System.out.println();
//打印结果出来
}else{
System.out.println("can't connected to the server");
}
//关闭连接
if(closeConn()) System.out.println("connection has been closed");
}catch(IOException e){
System.out.println("Error1:"+e);
closeConn();
}
}
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qizi168 2005-10-19
  • 打赏
  • 举报
回复
liu_you: socket.setReceiveBufferSize(num);这个方法返回的是当前socket缓冲的buffer长度,不是返回值的长度;

Maple99(Maple):message length error不是Exception 只是我取得的socket的返回字符串,搞得好像是socket服务器端返回的一样 ,但是不是,因为我们的服务器返回值是固定的(w2xxxxx格式)

liu_you(滴水藏海) :System.out.println("--读取数据中--");
这句无论任何情况下都会执行的
System.out.print("--返回数据为--"+outStr);
如果输入串符合格式 这句就能得到那个error信息
如果不符合格式 就死在这之前 不执行这句
OnlyFor_love: read()
读取单一字符。
read(char[], int, int)
将若干字符读入一个数组中。
readLine()
读取一文本行。
因为要取得长度 所有使用了read() 返回值是字符的asc 不是字符数
洪泉 2005-10-19
  • 打赏
  • 举报
回复
up!!!
qizi168 2005-10-18
  • 打赏
  • 举报
回复
谢谢 那个分号是笔误;br.read()是返回的int 是字符的asc2编码吧?可以作为字符来用的吧?
请问知道message length error是不是socket的错误信息吗?
OnlyFor_love 2005-10-18
  • 打赏
  • 举报
回复
br.read() 这个方法返回的是int值,而不是字符,所以我觉得你的tools.returnNum(br.read(),br.read());是有问题的!
OnlyFor_love 2005-10-18
  • 打赏
  • 举报
回复
还有就是br.read(rs,0,num);
因为它是有返回值的,你可以通过返回值去看一下是否已经读取

如果返回-1,则表示已经读到末尾,反之则表示读取字符数目。
OnlyFor_love 2005-10-18
  • 打赏
  • 举报
回复
for(int i=0;i<inputChar.length;i++)
{
bw.write(inputChar[i]);
};

这里怎么有一个分号?????
layueer 2005-10-18
  • 打赏
  • 举报
回复
up
OnlyFor_love 2005-10-18
  • 打赏
  • 举报
回复
br.read()是返回的int 是字符的asc2编码吧?可以作为字符来用的吧?

它返回的应该是你读了几个字符,而不是ASCII 你看看jdk中对这个方法的描述,具体我忘了
呵呵
liu_you 2005-10-18
  • 打赏
  • 举报
回复
System.out.println("--读取数据中--");
这句有没有执行,
System.out.print("--返回数据为--"+outStr);
这句又有没有?
一看就应该知道!
我只是粗看了一下代码,觉得那句可能有问题,你自己调试一下!
Maple99 2005-10-18
  • 打赏
  • 举报
回复
message length error
这个错误是那行代码跳出的exception??
liu_you 2005-10-18
  • 打赏
  • 举报
回复
socket.setReceiveBufferSize(num); //用来判断接受到的消息长度
看看之前的num是多少!

67,512

社区成员

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

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