目前我有一个问题是这样的共有程序A,BB监听端口,A作为客户端连接。
A向B发送大量请求,B收到请求,返回相应的回应。
现在发现这样的问题,发送一会之后,显示A已经发送成功,实际B收到的时候已经延迟了一段时间,同样B发回给A的时候也同样是这样一种情况。请问各位,这种情况如何提高效率?

解决方案 »

  1.   

    你说是TCP,一个客户端只要发送一次请求就行了,怎么是大量的请求呢?应该是大量的数据吧,如果数据量比较大,程序在处理的时候当然是需要时间的了
      

  2.   

    客服两边加上socket.setTcpNoDelay(true);了没
      

  3.   

    客户端接收代码
    int len = readBuffer.remaining();
    if( len == 0 ){
    readBuffer.position(0);
    log.warn("缓冲区满,不能接收数据。dump="+HexDump.hexDumpCompact(readBuffer));
    readBuffer.clear();
    len = readBuffer.remaining();
    }
    byte[] in = readBuffer.array();
    int off = readBuffer.position();
    int n = socket.getInputStream().read(in,off,len);
    if( n<=0 )
    return -1;
    lastReadTime = System.currentTimeMillis();
    readBuffer.position(off+n);
    readBuffer.flip();
    客户端发送代码
    if( null == socket )
    return false;
    boolean done = false;
    sendBuffer.clear();
    int cnt = 100;
    while( !done && --cnt>0 ){
    done = msg.write(sendBuffer);
    sendBuffer.flip();
    byte[] out = sendBuffer.array();
    int len = sendBuffer.remaining();
    int off = sendBuffer.position();
    try{
    socket.getOutputStream().write(out, off, len);
    socket.getOutputStream().flush();
    }catch(Exception e){
    String info = "client closed in '_send' reason is"+e.getLocalizedMessage()+", peer="+getPeerAddr();
    log.error(info,e);
    trace.trace(info, e);
    _closeSocket();
    return false;
    }
    }
    return true;
    服务端发送代码 int bytesWritten = 0;
    while( bufWrite.hasRemaining() ){
    try{
    bytesWritten = channel.write(bufWrite);
    }catch(IOException exp){
    String s = "channel.write()异常,原因"+exp.getLocalizedMessage();
    log.warn(s,exp);
    trace.trace(s);
    throw new SocketClientCloseException(exp);
    }
    if( 0 == bytesWritten ){
    trace.trace("send 0 bytes.");
    return false; //socket buffer full,但是还有数据没有发送完
    }
    }
    //缓冲区buf数据全部写到socket buffer
    bufWrite.clear(); //缓冲区清空以便下次写
    return true;
    服务端接收代码 int bytesRead = 0;
    IMessage msg = null;
    while(null != channel ){
    try{
    try{
    bytesRead = channel.read(bufRead);
    }catch(SocketTimeoutException expt){
    continue;
    }
    bufRead.flip();
    }catch(IOException e){
    log.warn("channel.read(bufRead) Exception:"+e.getLocalizedMessage());
    trace.trace("channel.read(bufRead) Exception:"+e.getLocalizedMessage());
    throw new SocketClientCloseException(e);
    }
    if( bytesRead <= 0 ){ //对方主动关闭
    String info = "client close by peer:"+peerAddr;
    log.info(info);
    trace.trace(info);
    throw new SocketClientCloseException(info);
    }
    if( null == channel )
    break;
    //Handle received data. 收到数据进行处理
    while(bufRead.hasRemaining()){
    if( null == msg ){
    int rem1 = bufRead.remaining();
    msg = server.createMessage(bufRead);
    int rem2 = bufRead.remaining();
    if( null == msg ){
    if( rem1>=13 && rem1 == rem2 ){
    //大于13字节,一定可以识别国网 浙规的报文。即使不能识别,也需要丢弃非法数据。
    //否则表示服务器配置的messageCreator不能创建对象。
    String info = "消息对象类型配置错误,server port="+server.getPort();
    log.fatal(info);
    throw new SocketClientCloseException(info);
    }
    else{
    if( bufRead.hasRemaining() )
    bufRead.compact();
    else
    bufRead.clear();
    break;
    }
    }
    msg.setSource(SyncSocketClient.this);
    msg.setServerAddress(server.getServerAddress());
    }
    boolean down = false;
    try{
    down = msg.read(bufRead);
    }catch(MessageParseException mpe){
    String expInfo = mpe.getLocalizedMessage();
    log.warn("Read Message Exception:"+expInfo,mpe);//log.warn("读消息异常:"+expInfo,mpe);
    throw new SocketClientCloseException(mpe.getLocalizedMessage());
    }
    if( down ){ //消息已经完整读取。
    msg.setIoTime(System.currentTimeMillis());
    msg.setPeerAddr(getPeerAddr());
    msg.setTxfs(getServer().getTxfs());
    setLastReadTime();
    server.incRecvMessage();
    server.setLastReceiveTime(System.currentTimeMillis());
    if( msg.isHeartbeat() ){
    trace.trace("recevie heart-beat from"+getPeerAddr());
    }
    ReceiveMessageEvent ev = new ReceiveMessageEvent(msg,SyncSocketClient.this);
    msg = null;
    GlobalEventHandler.postEvent( ev );
    }
    else
    break;
    }
    if( bufRead.hasRemaining() )
    bufRead.compact();
    else
    bufRead.clear();
    }