锁定老帖子 主题:socket 优化传输效率!!高手进
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-25
最后修改:2011-04-25
客户端换了,
新旧客户端,两台都是pc server上的(xp sp3) |
|
返回顶楼 | |
发表时间:2011-04-25
kimmking 写道 客户端换了,
新旧客户端,两台都是pc server上的(xp sp3) 可能我碰到的是个案,仅供参考。 |
|
返回顶楼 | |
发表时间:2011-04-25
用mina试试。
|
|
返回顶楼 | |
发表时间:2011-04-25
read 阻塞是由于没有新的数据达到客户端,所以read才会阻塞到,这个是正常的,三个问题
1 lz两台机器是同一个网段吗 2 两个机器连接没有通过一个proxy把 3 是否有额外的进程(防火墙?) 如果方便,实现的关键代码贴出来下 ,这种socket单节点通信实现都是差不多,不用怕什么代码泄露 |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2011-04-25
最后修改:2011-04-25
我看了看这个
http://en.wikipedia.org/wiki/Nagle's_algorithm 我就好奇,这个算法在传输数据较多,较频繁的情况下,从理论上讲明明是可以提升效率的,为啥禁用了,反而效率高呢 |
|
返回顶楼 | |
发表时间:2011-04-25
上面的代码
1 socket.setPerformancePreferences(connectionTime, latency, bandwidth)为什么bandwidth(带宽权重要设置为0),试试socket.setPerformancePreferences(0,1,2) 2 还有缓冲区被注释了,明显还是要缓冲比较好 |
|
返回顶楼 | |
发表时间:2011-04-25
试一下关闭相关计算机的防火墙或杀毒软件
|
|
返回顶楼 | |
发表时间:2011-04-25
nakupanda 写道 试一下关闭相关计算机的防火墙或杀毒软件
我应该已经把防火墙什么的都关闭了!! |
|
返回顶楼 | |
发表时间:2011-04-25
用mina,netty试一下。是不是程序有问题
|
|
返回顶楼 | |