我用网络上的通信软件对javasocket进行测试,发送只有在断开连接之后Java后台才能接收到相应的发送信息,并不能即使接收到对应的信息。
求,如何解决这个问题,我发一下我启动socket连接的代码public void run() {
PrintWriter out=null;
BufferedReader in=null;
try {
out=new PrintWriter(socket.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine="";

while((inputLine=in.readLine())!=null) {
if(MessageUtil.validate(inputLine)) {
Sinfo sinfo = MessageUtil.getSinfo(inputLine);
if(sinfo != null) {
Sdevice sdevice = GlobalService.getSdeviceService().getBySimnum(sinfo.getSimnum());
sdevice.getSinfos().add(sdevice);
sinfo.setSdevice(sdevice);
GlobalService.getSinfoService().saveObject(sinfo);
}
System.out.println(MessageUtil.getSinfo(inputLine).toString());
} else {
System.out.println("接收到的信息为错误信息 : " + inputLine);
}
}

in.close();
out.close();
socket.close();
} catch (Exception e) {
logger.error("连接时发生异常:" + e.toString());
}
}

解决方案 »

  1.   

    再添加个说明下,用工具进行连接的时候会一直卡在inputLine=in.readLine()上,直到工具断开连接之后才会把所有的信息当成一条直接发送过去。
      

  2.   

    补充readLine():Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
      

  3.   

    如果lz的程序是在接收数据,那么应该是发送信息没有收到行结束符的原因。为什么断开连接时会收到数据,是因为它认为到了流的结尾,所以断开时能收到数据。
    如果lz的信息格式,并没有约定用行结束符来分隔数据,那么用ReadLine方法是不合适的。比如,xml数据看起来是分行了,但是实际上那个分行是编辑器在显示时候的效果,文本里并没有分行。
    建议lz用网络抓包工具测试下,诊断原因。只要数据发送了,是一定会收到的。
      

  4.   

    inputLine=in.readLine()
    没有什么东西读的时候不阻塞,还能干嘛?
    和这种情况是一致的while((count=in.read(buff))!=-1){}
    in没有发送信息,不代表count就一定等于-1.明白么?它会一直阻塞,直到超时!你应该在{}进行长度的判断如果达到了你需求你就应该主动的跳出循环。所以不管是什么8583,tlv报文都是有长度可循的呢。
    这必定不能像文件那样操作。文件读完了会返回-1通信怎么可能呢。希望你明白了