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