运行一java客户端程序, 与服务器连接,建立套接字,构建输入输出流, 向输出流中写入数据,  当运行到这地方时主板发出报警声,有时2短声,有时1长2短或1长3短。执行的代码片段如下: public int sendLoginPacketData(Socket  sk , HostInfor hsInf ){
/*
DataOutputStream  out = null ;
DataInputStream  in = null ;
byte[] data = new byte[COMMON.MAX_DATALEN ] ;
byte[] headdata = new byte[ COMMON.MAX_DATAHEADLEN] ;
byte[] recvdata = new byte[COMMON.MAX_DATALEN ] ;
int datalen = 0  , m , n  , contlen ;
DataPacket  loginDataPacket = new DataPacket() ;
DataPacket  loginRspDataPacket = new DataPacket() ;
Log lg = Log.getInstance() ;

try{
if( hsInf.getUserClient() != null )
  loginDataPacket.setContent( hsInf.getUserClient().getUserNameMd5() + hsInf.getUserClient().getPasswordMd5() ) ;
else
  loginDataPacket.setContent("no") ;
  
  loginDataPacket.composeData( COMMON.CMD_LOGIN ) ;
  
  loginDataPacket.setCmd( COMMON.CMD_LOGIN ) ;
  
  out = new DataOutputStream( sk.getOutputStream() ) ;
  in = new DataInputStream( sk.getInputStream() ) ;
  
  datalen = loginDataPacket.getSendData( data) ;
  if( datalen < COMMON.MAX_DATAHEADLEN )
    return -1 ;
    
  out.write(data, 0 , datalen) ;
  
  n = in.read( headdata , 0 , COMMON.MAX_DATAHEADLEN ) ;
  m = n ;
  while( m < COMMON.MAX_DATAHEADLEN && n != -1 ){
   n = in.read( headdata , m , COMMON.MAX_DATAHEADLEN - m ) ;
   m = m + n ;
  }
  loginRspDataPacket.setDataHead(  headdata , 0 , COMMON.MAX_DATAHEADLEN ) ;
  loginRspDataPacket.parseDataHead() ;
  contlen = loginRspDataPacket.getDataLen() ;
  m = 0 ;
  n = 0 ;
  n = in.read(recvdata , 0 , contlen ) ;
  m = n ;
  while( m < contlen && m < ( COMMON.MAX_DATALEN - COMMON.MAX_DATAHEADLEN) && n != -1 ){
   n = in.read(recvdata , m  , contlen - m ) ;
   m = m + n ; 
  }
  loginRspDataPacket.setDataContent( recvdata , 0 , contlen ) ;
  System.out.println( loginRspDataPacket.toString() );
  if( loginRspDataPacket.getCmd() == COMMON.CMD_REP_LOGIN && loginRspDataPacket.getContent().equals( COMMON.CMD_RP_VALID) )
        return 0 ;
      else
        return -1 ; 
}catch( Exception e ){
lg.writeLog( COMMON.getCurTimeEx(0) + "向服务器发送请求数据包产生异常" + e, COMMON.LOG_LEVEL_3) ;
return -1 ;
}*/
return 0 ;
}

解决方案 »

  1.   

    System.out.println( loginRspDataPacket.toString() );把这句话注释掉,很可能就不报警了。
      

  2.   

    1  换别的机器也试 了,情况一样。2  System.out.println( loginRspDataPacket.toString() );  这句话是用来查看数据包的内容是否正确,去掉还是报警。
    解释一下这段代码的含义:1 参数 sk:已经建立到服务器端的套接字连接。
           hsInf: 主机信息对象, 包含要连接到服务器的名称、ip地址、端口号等
    2 先构建一个数据包loginDataPacket  ,设置数据包内容。3 把数据包数据写到输出流中 ,即:out.write(data, 0 , datalen) ; 而正当运行到这一句时主板报警,注释掉后正常。更奇怪的是另外一个方法B, 其中向输出流写数据和从输入流中读取数据的代码块和这个方法是完全一样的,而方法B运行正常,但是当设置数据包的内容为“1111111”时方法B也导致主板报警。 困惑中...找了两天了还没结果,期盼高手,在线等...
      

  3.   

    你可能在其它地方调用了System.out或System.err,写入ASCII码为7的字符的时候,主板就会报警。
      

  4.   

    public class Test7{

    public static void main(String[] args){
    for(int i=0;i<10;i++){
    System.out.println((char)7);
    }
    }}运行一下这个,试试? 呵呵
      

  5.   

    非常感谢 yingle2000 和 bigbug9002 的帮助, 问题已经解决了, 就是这个原因。我在定义数据包时,数据包的前4byte为数据包的长度,把数据包长度转换成32bit二进制从高位到低位放置到这4个byte里面,  在数据包的toString() 方法中把整个数据包的内容转换为String输出就有可能导致这种情况。
    万分感激...,等着接分啊~~