论坛首页 Java企业应用论坛

socket 优化传输效率!!高手进

浏览 25281 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-25   最后修改:2011-04-25
客户端换了,
新旧客户端,两台都是pc server上的(xp sp3)
0 请登录后投票
   发表时间:2011-04-25  
kimmking 写道
客户端换了,
新旧客户端,两台都是pc server上的(xp sp3)

可能我碰到的是个案,仅供参考。
0 请登录后投票
   发表时间:2011-04-25  
用mina试试。
0 请登录后投票
   发表时间:2011-04-25  
read 阻塞是由于没有新的数据达到客户端,所以read才会阻塞到,这个是正常的,三个问题
1 lz两台机器是同一个网段吗
2 两个机器连接没有通过一个proxy把
3 是否有额外的进程(防火墙?)

如果方便,实现的关键代码贴出来下 ,这种socket单节点通信实现都是差不多,不用怕什么代码泄露
0 请登录后投票
   发表时间:2011-04-25   最后修改:2011-04-25
kakaluyi 写道
read 阻塞是由于没有新的数据达到客户端,所以read才会阻塞到,这个是正常的,三个问题
1 lz两台机器是同一个网段吗
2 两个机器连接没有通过一个proxy把
3 是否有额外的进程(防火墙?)

如果方便,实现的关键代码贴出来下 ,这种socket单节点通信实现都是差不多,不用怕什么代码泄露


代码并不复杂,跟附件中的小程序,类似!单线程,单客户端连接的情况

server:
incomingConnection = server.accept();
//                incomingConnection.setSendBufferSize(Env.SO_SENDBUFF);
                if(!incomingConnection.getTcpNoDelay()) incomingConnection.setTcpNoDelay(true);
                incomingConnection.setPerformancePreferences(1,2,0);
                incomingConnection.setTrafficClass(0x1C);
                handleConnection(incomingConnection);


处理
Object obj = null;
		Instruction inst = null;
		try{
			inst = Instruction.malloc();
			//long st = System.currentTimeMillis();
			if (read(in, inputBuffer, 0, s) != s) {
				Instruction.free(inst);
				return -1;
			}
			int r = InstructionType.typeOf(inputBuffer, sbit, ebit);
			if (r == InstructionType.XFR)
				obj = unpack(inst,in, inputBuffer, s);
			else if (r == InstructionType.CCC)
				obj = unpackCCC(inst,param,in, inputBuffer, s);

		}catch (EmptyStackException ex) {
			return NISAC_RESULT_CODE.RULE_FULL; 
		}catch (IOException e) {
			if (inst != null) {
				log4j.error("IOException:" + inst.toString());
				Instruction.free(inst);
			}
			inst = null;
			throw e;
		}

		return obj;


响应
if(!NISAC_HEAD.pack(head, outputBuffer, 0)) return false;
		
		if(!BLOCK_0D.pack(block, outputBuffer, NISAC_HEAD.BLOCK_LENGTH)) return false;
		
		out.write(outputBuffer, 0, head.message_length*4);
		return true;




client:=================================================
connection = new Socket(hostIp, hostPort);
            	in = new DataInputStream(connection.getInputStream());
            	out = new DataOutputStream(connection.getOutputStream());
//            	connection.setReceiveBufferSize(1024);
//            	connection.setSendBufferSize(1024);
            	if(!connection.getTcpNoDelay())connection.setTcpNoDelay(true);
            	connection.setPerformancePreferences(1,2,0);
            	connection.setTrafficClass(0x1C);

获取响应

read(in,inputBuffer, NISAC_HEAD.BLOCK_LENGTH);
		NISAC_HEAD.unpack(inputBuffer, 0, head);

		if (head.block_type == BLOCK_0D.BLOCK_TYPE) {
			read(in,inputBuffer, (head.message_length * 4 - NISAC_HEAD.BLOCK_LENGTH));
			BLOCK_0D.unpack(inputBuffer, 0, block);
			if (block.result == NISAC_RESULT_CODE.OK) {
				return true;
			}
		}

0 请登录后投票
   发表时间:2011-04-25   最后修改:2011-04-25
我看了看这个
http://en.wikipedia.org/wiki/Nagle's_algorithm
我就好奇,这个算法在传输数据较多,较频繁的情况下,从理论上讲明明是可以提升效率的,为啥禁用了,反而效率高呢
0 请登录后投票
   发表时间:2011-04-25  
上面的代码
1 socket.setPerformancePreferences(connectionTime, latency, bandwidth)为什么bandwidth(带宽权重要设置为0),试试socket.setPerformancePreferences(0,1,2)
2 还有缓冲区被注释了,明显还是要缓冲比较好
0 请登录后投票
   发表时间:2011-04-25  
试一下关闭相关计算机的防火墙或杀毒软件
0 请登录后投票
   发表时间:2011-04-25  
nakupanda 写道
试一下关闭相关计算机的防火墙或杀毒软件


我应该已经把防火墙什么的都关闭了!!
0 请登录后投票
   发表时间:2011-04-25  
用mina,netty试一下。是不是程序有问题
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics