- 浏览: 2669587 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
TcpNoDelay=false,为启用nagle算法,也是默认值。 Nagle算法的立意是良好的,避免网络中充塞小封包,提高网络的利用率。但是当Nagle算法遇到delayed ACK悲剧就发生了。Delayed ACK的本意也是为了提高TCP性能,跟应答数据捎带上ACK,同时避免糊涂窗口综合症,也可以一个ack确认多个段来节省开销。悲剧发生在这种情况,假设一端发送数据并等待另一端应答,协议上分为头部和数据,发送的时候不幸地选择了write-write,然后再read,也就是先发送头部,再发送数据,最后等待应答。
实验模型:
发送端(客户端)
write(head);
write(body);
read(response);
接收端(服务端)
read(request);
process(request);
write(response);
这里假设head和body都比较小,当默认启用nagle算法,并且是第一次发送的时候,根据nagle算法,第一个段head可以立即发送,因为没有等待确认的段;接收端(服务端)收到head,但是包不完整,继续等待body达到并延迟ACK;发送端(客户端)继续写入body,这时候nagle算法起作用了,因为head还没有被ACK,所以body要延迟发送。这就造成了发送端(客户端)和接收端(服务端)都在等待对方发送数据的现象:
发送端(客户端)等待接收端ACK head以便继续发送body;
接收端(服务端)在等待发送方发送body并延迟ACK,悲剧的无以言语。
这种时候只有等待一端超时并发送数据才能继续往下走。
代码:
发送端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Client {
private static Logger logger = Logger.getLogger(Client.class);
public static void main(String[] args) throws Exception {
// 是否分开写head和body
boolean writeSplit = true;
String host = "localhost";
logger.debug("WriteSplit:" + writeSplit);
Socket socket = new Socket();
socket.setTcpNoDelay(false);
socket.connect(new InetSocketAddress(host, 10000));
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String head = "hello ";
String body = "world\r\n";
for (int i = 0; i < 10; i++) {
long label = System.currentTimeMillis();
if (writeSplit) {
out.write(head.getBytes());
out.write(body.getBytes());
} else {
out.write((head + body).getBytes());
}
String line = reader.readLine();
logger.debug("RTT:" + (System.currentTimeMillis() - label) + ", receive: " + line);
}
in.close();
out.close();
socket.close();
}
}
接收端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Server {
private static Logger logger = Logger.getLogger(Server.class);
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(10000));
logger.debug(serverSocket);
logger.debug("Server startup at 10000");
while (true) {
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
while (true) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
logger.debug(line);
out.write((line + "\r\n").getBytes());
} catch (Exception e) {
break;
}
}
}
}
}
实验结果:
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Server
1 [main] DEBUG socket.nagle.Server - ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=10000]
6 [main] DEBUG socket.nagle.Server - Server startup at 10000
4012 [main] DEBUG socket.nagle.Server - hello world
4062 [main] DEBUG socket.nagle.Server - hello world
4105 [main] DEBUG socket.nagle.Server - hello world
4146 [main] DEBUG socket.nagle.Server - hello world
4187 [main] DEBUG socket.nagle.Server - hello world
4228 [main] DEBUG socket.nagle.Server - hello world
4269 [main] DEBUG socket.nagle.Server - hello world
4310 [main] DEBUG socket.nagle.Server - hello world
4350 [main] DEBUG socket.nagle.Server - hello world
4390 [main] DEBUG socket.nagle.Server - hello world
4392 [main] DEBUG socket.nagle.Server -
4392 [main] DEBUG socket.nagle.Server -
实验1:当WriteSplit=true and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
52 [main] DEBUG socket.nagle.Client - RTT:12, receive: hello world
95 [main] DEBUG socket.nagle.Client - RTT:42, receive: hello world
137 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
178 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
218 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
259 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
300 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
341 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
382 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
422 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
可以看到,每次请求到应答的时间间隔都在40ms,除了第一次。linux的delayed ack是40ms,而不是原来以为的200ms。第一次立即ACK,似乎跟linux的quickack mode有关,这里我不是特别清楚,
其实问题不是出在nagle算法身上的,问题是出在write-write-read这种应用编程上。禁用nagle算法可以暂时解决问题,但是禁用 nagle算法也带来很大坏处,网络中充塞着小封包,网络的利用率上不去,在极端情况下,大量小封包导致网络拥塞甚至崩溃。在这种情况下,其实你只要避免write-write-read形式的调用就可以避免延迟现象,如下面这种情况发送的数据不要再分割成两部分。
实验2:当WriteSplit=false and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
27 [main] DEBUG socket.nagle.Client - RTT:4, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
34 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
42 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
44 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
47 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
50 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
53 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
54 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
实验3:当WriteSplit=true and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
25 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
28 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
33 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
49 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
52 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
56 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
59 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
实验4:当WriteSplit=false and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
21 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
23 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
27 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
30 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
32 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
43 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
46 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
实验2到4,都没有出现延时的情况。
注意:以上实验在windows上测试下面的代码,客户端和服务器必须分在两台机器上,似乎winsock对loopback连接的处理不一样。下面的我的做法是:服务端与客户端都在一台Linux机上。
实验模型:
发送端(客户端)
write(head);
write(body);
read(response);
接收端(服务端)
read(request);
process(request);
write(response);
这里假设head和body都比较小,当默认启用nagle算法,并且是第一次发送的时候,根据nagle算法,第一个段head可以立即发送,因为没有等待确认的段;接收端(服务端)收到head,但是包不完整,继续等待body达到并延迟ACK;发送端(客户端)继续写入body,这时候nagle算法起作用了,因为head还没有被ACK,所以body要延迟发送。这就造成了发送端(客户端)和接收端(服务端)都在等待对方发送数据的现象:
发送端(客户端)等待接收端ACK head以便继续发送body;
接收端(服务端)在等待发送方发送body并延迟ACK,悲剧的无以言语。
这种时候只有等待一端超时并发送数据才能继续往下走。
代码:
发送端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Client {
private static Logger logger = Logger.getLogger(Client.class);
public static void main(String[] args) throws Exception {
// 是否分开写head和body
boolean writeSplit = true;
String host = "localhost";
logger.debug("WriteSplit:" + writeSplit);
Socket socket = new Socket();
socket.setTcpNoDelay(false);
socket.connect(new InetSocketAddress(host, 10000));
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String head = "hello ";
String body = "world\r\n";
for (int i = 0; i < 10; i++) {
long label = System.currentTimeMillis();
if (writeSplit) {
out.write(head.getBytes());
out.write(body.getBytes());
} else {
out.write((head + body).getBytes());
}
String line = reader.readLine();
logger.debug("RTT:" + (System.currentTimeMillis() - label) + ", receive: " + line);
}
in.close();
out.close();
socket.close();
}
}
接收端代码
[java] view plaincopyprint?
package socket.nagle;
import java.io.*;
import java.net.*;
import org.apache.log4j.Logger;
public class Server {
private static Logger logger = Logger.getLogger(Server.class);
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(10000));
logger.debug(serverSocket);
logger.debug("Server startup at 10000");
while (true) {
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
while (true) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
logger.debug(line);
out.write((line + "\r\n").getBytes());
} catch (Exception e) {
break;
}
}
}
}
}
实验结果:
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Server
1 [main] DEBUG socket.nagle.Server - ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=10000]
6 [main] DEBUG socket.nagle.Server - Server startup at 10000
4012 [main] DEBUG socket.nagle.Server - hello world
4062 [main] DEBUG socket.nagle.Server - hello world
4105 [main] DEBUG socket.nagle.Server - hello world
4146 [main] DEBUG socket.nagle.Server - hello world
4187 [main] DEBUG socket.nagle.Server - hello world
4228 [main] DEBUG socket.nagle.Server - hello world
4269 [main] DEBUG socket.nagle.Server - hello world
4310 [main] DEBUG socket.nagle.Server - hello world
4350 [main] DEBUG socket.nagle.Server - hello world
4390 [main] DEBUG socket.nagle.Server - hello world
4392 [main] DEBUG socket.nagle.Server -
4392 [main] DEBUG socket.nagle.Server -
实验1:当WriteSplit=true and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
52 [main] DEBUG socket.nagle.Client - RTT:12, receive: hello world
95 [main] DEBUG socket.nagle.Client - RTT:42, receive: hello world
137 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
178 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
218 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
259 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
300 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
341 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
382 [main] DEBUG socket.nagle.Client - RTT:41, receive: hello world
422 [main] DEBUG socket.nagle.Client - RTT:40, receive: hello world
可以看到,每次请求到应答的时间间隔都在40ms,除了第一次。linux的delayed ack是40ms,而不是原来以为的200ms。第一次立即ACK,似乎跟linux的quickack mode有关,这里我不是特别清楚,
其实问题不是出在nagle算法身上的,问题是出在write-write-read这种应用编程上。禁用nagle算法可以暂时解决问题,但是禁用 nagle算法也带来很大坏处,网络中充塞着小封包,网络的利用率上不去,在极端情况下,大量小封包导致网络拥塞甚至崩溃。在这种情况下,其实你只要避免write-write-read形式的调用就可以避免延迟现象,如下面这种情况发送的数据不要再分割成两部分。
实验2:当WriteSplit=false and TcpNoDelay=false 启用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
27 [main] DEBUG socket.nagle.Client - RTT:4, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
34 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
42 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
44 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
47 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
50 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
53 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
54 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
实验3:当WriteSplit=true and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:true
25 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
28 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
31 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
33 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:6, receive: hello world
49 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
52 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
56 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
59 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
实验4:当WriteSplit=false and TcpNoDelay=true 禁用nagle算法
[plain] view plaincopyprint?
[test5@cent4 ~]$ java socket.nagle.Client
0 [main] DEBUG socket.nagle.Client - WriteSplit:false
21 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
23 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
27 [main] DEBUG socket.nagle.Client - RTT:3, receive: hello world
30 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
32 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
35 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
38 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
41 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
43 [main] DEBUG socket.nagle.Client - RTT:1, receive: hello world
46 [main] DEBUG socket.nagle.Client - RTT:2, receive: hello world
实验2到4,都没有出现延时的情况。
注意:以上实验在windows上测试下面的代码,客户端和服务器必须分在两台机器上,似乎winsock对loopback连接的处理不一样。下面的我的做法是:服务端与客户端都在一台Linux机上。
发表评论
-
TCP滑动窗口
2014-06-04 16:10 857目前建立在TCP协议上的网络协议特别多,有telnet,ss ... -
TCP 滑动窗口协议
2013-11-07 18:36 5571TCP滑动窗口机制 我们可以大概看一下上图的模型 ... -
关于JAVA取本机ip的一些总结
2013-09-13 14:29 8239通常绑定本机ip地址 一般如下 I ... -
网络编程中Nagle算法和Delayed ACK的测试
2013-07-28 22:44 955网络编程中Nagle算法和Delayed ACK的测试 -
NFS-RPC框架优化过程(从37k到168k)
2013-07-18 22:17 1525NFS-RPC框架从编写之初,到现在为止(应该还会有些提升, ... -
Java程序员也应该知道的一些网络知识
2013-07-18 22:11 923对于需要编写网络通 ... -
深入理解JDBC的超时(timeout)设置
2013-06-26 15:27 6469真实案例:应用服务器在遭到DDos攻击后无法响应 在遭到 ... -
socket InputStream available()lock的问题
2013-03-28 18:45 3230在socket InputStream读取数据的问题记录一 ... -
socket参数对性能的影响
2013-03-26 14:51 1156今天发现线上一台机器的cilent端很慢,通过打点记录相关 ... -
socket InputStream读取数据的问题记录
2013-03-13 17:42 2440在用java写socket client的发现一个问题,如 ... -
python高性能网络框架Twisted介绍
2012-11-12 21:48 0什麼是Twisted Twisted是一 ... -
Reactor模式,或者叫反应器模式
2012-11-12 20:58 0原文:http://daimojingde ... -
libevent源码分析
2012-11-12 20:52 986原文参考: http://blog.csdn.net/spar ... -
java socket 参数说明
2012-11-10 16:19 1724Socket 的 I/O 调用可 ... -
一个自定义协议的例子
2012-11-10 14:54 3024public class VoteMsg { pr ... -
Socket send函数和recv函数详解
2012-11-09 12:17 1088int send( SOCKET s, c ... -
python struct
2012-11-07 14:03 794在使用python向java发送数据的时候一般是需要记录数据长 ... -
Frame实现
2012-11-06 21:01 880这里讨论Frame的实现问题。 -
Java Socket codec
2012-11-06 20:08 1165要写好java的网络编程并 ... -
Java网络编程--Socket编程
2012-11-03 23:07 1032原文:http://blog.sina.com.c ...
相关推荐
- `Handlers`从队列中取出`Call`对象,解析参数为`Invocation`对象,利用Java反射API调用服务端的实例对象处理请求,获取返回结果,并将结果封装到`Call`的`response`属性中。 - 处理完成后,调用`Responder`的`...
nodejs010-nodejs-cryptiles-0.2.2-1.el6.centos.alt.noarch.rpm
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于麻雀搜索算法优化的深度置信网络(SSA-DBN)参数调整与数据分类预测——以隐藏层节点、迭代次数和学习率为优化目标的MATLAB实现,基于麻雀搜索算法优化深度置信网络(SSA-DBN)的数据分类预测 优化参数为隐藏层节点、迭代次数和学习率 利用交叉验证抑制过拟合问题 matlab代码, ,SSA-DBN; 参数优化; 隐藏层节点; 迭代次数; 学习率; 交叉验证; 过拟合抑制; MATLAB代码,基于SSA-DBN优化的数据分类预测方法:参数优化与过拟合抑制
BeTheme第一次发布于2014年5月21日,自那时以来,已有数以百万计的人下载了BeTheme,其评分为4.8。这个主题是WooCommerce支持的,在此帮助下,您可以制作一个电子商务网站,还可以制作博客、新闻和其他类型的网站。BeTheme 21.5.6 wordpress主题模板特点:放大器支撑多用途主题500+预制件演示单击演示安装移动友好型主题联络表格7支持自转滑块。
基于S7-200智能控制与组态王4x3界面的书架式堆垛立体车库系统设计与应用,基于S7-200和组态王4x3书架式堆垛式立体库立体车库 ,S7-200; 组态王4x3; 书架式堆垛式立体库; 立体车库,基于S7-200与组态王4x3的立体车库系统
1、文件内容:pykde4-akonadi-4.10.5-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pykde4-akonadi-4.10.5-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
基于28379D的异步电机无速度传感器控制:MD500与MD500E滑模同步调制代码研究,各种代码md500代码,异步电机,基于28379D,带无速度传感器控制,参数辨识,同步调制等功能。 还有md500e代码,滑模无感代码,逆变整流代码 ,核心关键词:md500代码; 异步电机; 28379D; 无速度传感器控制; 参数辨识; 同步调制; md500e代码; 滑模无感控制; 逆变整流代码。,基于28379D的MD500电机异步控制系统与参数辨识软件
"可再生能源驱动的热电联供微网经济运行优化研究:基于具体文献的程序复现与MATLAB粒子群算法应用",含可再生能源的热电联供型微网经济运行优化 有具体文献 程序复现 MATLAB粒子群算法 ,核心关键词: 可再生能源; 热电联供型微网; 经济运行优化; 具体文献; 程序复现; MATLAB粒子群算法。,含可再能源热电联供型微网运行优化策略复现于特定文献中的MATLAB模型研究。
1、文件内容:pyserial-2.6-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pyserial-2.6-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
finishBitmap.jpg
"英博尔控制器调速软件全面升级,引领行业新风尚",英博尔控制器调速软件全新 ,英博尔; 控制器; 调速软件; 全新,英博尔控制器调速软件全新升级
电机定子模态频率计算方法及公式在Excel表格中的应用,电机定子模态频率计算公式,公式法,exl表格 ,电机定子模态频率计算公式; 公式法; EXL表格,电机定子模态频率计算方法及公式法在Excel表格中的应用
一、项目简介 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、用户 2、系统功能 主要功能包括: 用户登录注册 首页 个人中心 修改密码 个人信息 用户管理 管理员管理 问卷管理 题目管理 题目统计 问卷调查管理 新闻资讯管理 轮播图管理 问卷调查 新闻资讯 个人中心 问卷调查记录 后台管理 详见 https://flypeppa.blog.csdn.net/article/details/143189415
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pulseaudio-esound-compat-10.0-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pulseaudio-esound-compat-10.0-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
一种基于Lifelogging视频的文本标签生成模型.pdf
MATLAB仿真:MIMO系统FLMS算法的优化与实现,一个mimo系统的flms算法的MATLAB仿真 ,Mimo系统; FLMS算法; MATLAB仿真,"MIMO系统FLMS算法MATLAB仿真"
"基于S7-200 PLC的组态王燃油锅炉控制系统:详解梯形图接线原理、IO分配及组态画面图解",基于S7-200 PLC和组态王燃油锅炉控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,S7-200 PLC; 组态王燃油锅炉控制; 梯形图接线图原理图; IO分配; 组态画面,基于S7-200 PLC的燃油锅炉控制系统原理图及IO分配解析