public void run() {
try {
// 读取输入流,如果由于流末尾已到达而不再有数据,则返回 -1,表示对方已经关闭.
BufferedInputStream bufInput = new BufferedInputStream(in);
streamData = new ByteArrayOutputStream();
//服务器接收流,如果对方的流永不断开,while无法结束,
//也不能进行数据加工处理,我想能否在流读取部分完整数据后,分批处理。
//这样就算流不断,我也可以边读,边处理数据。不知道怎么写好?
while ((len = bufInput.read(b)) != -1) {
streamData.write(b, 0, len);
}
bufInput.close();
in.close();
socket.close();
// 获取数据流后,把数据交给处理流数据对象,使得读取数据与处理数据分离.
if(streamData.size()>0){
new Thread(new ProcessRequestData(clientClass,cSupport,streamData)).start();
}else{
System.out.println("收到数据流数据内容为 0 字节.");
streamData.close();
}
} catch (SocketException se) {
se.printStackTrace();
} catch (IOException io) {
io.printStackTrace();
} finally{
ReleaseResource();
}
}

解决方案 »

  1.   

    读取Socket流,你应该先约定自己的协议。譬如首先传递一行数字,表明后续要发送的数据共有几长。客户端就可以根据这个长度来读取Socket流了所以你应该定好客户端与服务器的协议
      

  2.   

    报文的格式如下:
    1. XXX突发事件报文EB90F5
    类型及长度 含义
    1 Char(1) EB
    2 Char(1) 90
    3 Char(1) 报文字节顺序(sun: 1,alpha: 0, pc: 0)
    4 Char(1) F5
    5 Char(1) 年(从1990年起计数)
    6 Char(1) 月
    7 Char(1) 日
    8 Char(1) 时
    9 Char(1) 分
    10 Char(1) 秒
    11 Short(2) 个数M
    12 Short(2) 编号
    13 char(12) 编号,数据类型也可以是Int
    14 Short(2) 数据类型也可以是Int
    15 Char(1) xxx状态(开始:0, 结束:1)
    注:1). 域1至域2循环3次;
    2).域12至域15循环M次;
      

  3.   

    上面是格式,但是我想做一个通用的服务器,接收数据。
    总不能把数据标志写死吧?三次 :EB90EB90EB90,这样不行吧?
    怎么样让这个服务程序通用?
      

  4.   

    如果客户机不关闭:InputStream流,服务器就永远 while 不出来。
    怎么记程序读一部分,处理一部分?这是这边读,另一边看读到的内容,并处理?
      

  5.   

    公布结果:
    1 收到 S
    2 把S的流 in out分成二份,a读,写S; b写s,做成两个线程,
      读出来放在一个缓存队例(因为可能一次读不完(我一次1024byte),
      别一个取算是队列数据,从队里出来,判断,如果长度不够,再取下包(1024)数据,合起来(多余的数据可能是别一批数据开头,要保存)
    3 验正数据,如果正确,把读得的数据发给处理逻辑线程。