本文来自:fair-jm.iteye.com 转截请注明出处
只是一个简单的测试 在自己使用的笔记本上 测试结果也许有误
测试代码如下:
package com.cc.tools; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * fairjm * @author fairjm * fair-jm.iteye.com */ public class ConnectionTool { static volatile CountDownLatch count = null; //用来在main方法中等待任务完成 static AtomicInteger error = new AtomicInteger(0); //记载error的数量 public static void testConnection(final URL url, int times) { count = new CountDownLatch(times); //初始化 error = new AtomicInteger(0); final CountDownLatch latch = new CountDownLatch(1); //让Thread同时执行任务 for (int i = 0; i < times; i++) { new Thread(new Runnable() { @Override public void run() { try { latch.await(); //等待一起执行 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.getResponseCode(); connection.disconnect(); } catch (Exception e) { e.printStackTrace(); error.getAndIncrement(); } finally { count.countDown(); } } }).start(); } latch.countDown(); } public static void main(String[] args) throws MalformedURLException, InterruptedException { long time=0; long errors=0; for (int i = 0; i < 5; i++) { System.out.println("第"+i+"次"); long begin = System.currentTimeMillis(); // testConnection(new URL("http://localhost:8080/testConnection/index"),600); testConnection(new URL("http://localhost:9000"), 600); count.await(); long end = System.currentTimeMillis(); time+=(end-begin); errors+=error.get(); System.out.println((end-begin)+"ms"); System.out.println("错误个数:"+error.get()); TimeUnit.SECONDS.sleep(5); //暂停5s } System.out.println(time /5.0 + "ms"); System.out.println("error:" + errors / 5.0); } }
tomcat下:
servlet如下 返回hello:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try(OutputStream os=response.getOutputStream()){ os.write("hello".getBytes()); } }
netty用的是Play 2 也只是返回hello:
def index = Action { Ok("hello") }
因为有TCP连接数限制 所以测试结果不一定准确 记一次结果(省略掉连接被拒绝等一些错误的输出了)
600次(量很小 不足以说是性能测试 到1000左右的话 会产生一些奇怪的错误) 循环5次
tomcat版本(7.0.29 很久未升级 只是单纯测试用 勿怪):
第0次 1940ms 错误个数:0 第1次 1994ms 错误个数:0 第2次 2095ms 错误个数:0 第3次 1381ms 错误个数:0 第4次 1330ms 错误个数:0 平均:1748.0ms 平均error:0.0
netty(play 2.2.0 dev模式):
第0次 1843ms 错误个数:0 第1次 1498ms 错误个数:0 第2次 2193ms 错误个数:0 第3次 1435ms 错误个数:0 第4次 1719ms 错误个数:0 平均:1737.6ms 平均error:0.0
在这个连接数下tomcat和netty相差无几 但是连接数多的情况下 可以看出netty的性能更优(我这边在单机中进行实验非常容易就出现java.net.SocketException: Permission denied: connect的错误 更大的连接数就不打印报告了)
==================================================================================
啊哈 以上的原因找到了
只要在获取内容之前加上:
connection.setConnectTimeout(2000);
就好了
然后上面的测试就可以加更多的连接数了
http://stackoverflow.com/questions/5692102/java-socket-blocks-on-connection-to-a-server 写道
If the response is a 'SYN-ACK', it proceeds to establish the connection as per the protocol; see http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment.
If the response is an 'RST' (reset), the connect fails and this results in a Java "connection refused" exception. (This is typically what happens if the 'SYN' makes it to the remote server, only to discover that there is no application "listening" on the port you tried to connect on.)
If the response is an ICMP message of some kind (e.g. ICMP destination unreachable), this typically results in an immediate failure of the connection request, and a Java exception.
If there is no response, the OS tries again, and again, and again. Depending on the Java default connect timeout (or the explicit timeout), this process could continue for a long time.
If the response is an 'RST' (reset), the connect fails and this results in a Java "connection refused" exception. (This is typically what happens if the 'SYN' makes it to the remote server, only to discover that there is no application "listening" on the port you tried to connect on.)
If the response is an ICMP message of some kind (e.g. ICMP destination unreachable), this typically results in an immediate failure of the connection request, and a Java exception.
If there is no response, the OS tries again, and again, and again. Depending on the Java default connect timeout (or the explicit timeout), this process could continue for a long time.
相关推荐
SpringBoot以其快速、简洁的特性,极大地简化了Spring应用的初始搭建以及开发过程,而Netty则是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 SpringBoot整合Netty...
在IT行业中,SpringBoot和Netty是两个非常重要的框架,分别在Web开发和高性能网络通信领域有着广泛的应用。本文将详细探讨如何将SpringBoot与Netty整合,实现高效的网络通信并处理接收到的数据,将其存储到数据库中...
此外,可能还会进行性能测试,如压力测试、负载测试,以确定系统的稳定性和可扩展性。 综上所述,这个项目涉及到的技术栈包括Java Web应用开发、高性能网络编程、容器化部署以及分布式系统的监控和优化。开发者可能...
7. **测试与调试**:编写测试用例,验证SpringBoot与Netty的整合是否正常工作,确保数据能够正确地在SpringBoot和Netty之间传输。 8. **监控与日志**:集成SpringBoot的Actuator模块,实现健康检查和性能监控;使用...
Apache+Jboss(Tomcat)集群配置是一种常见的高可用性和负载均衡解决方案,它通过在前端部署Apache服务器,中间层配置多个Jboss或Tomcat应用服务器,后端连接统一的数据库来实现系统的扩展性和稳定性。以下是配置这个...
7. **启动与测试**:最后,可以通过 Spring 的 ContextLoaderListener 或 ApplicationContextInitializer 将 Spring 容器与 Servlet 容器(如 Tomcat)关联起来,使得 Netty 服务器在启动时初始化 Spring 容器。...
部署时,可以将打包的成果(如JAR或WAR)放到支持Servlet容器(如Tomcat)中,或者直接使用Netty作为独立服务器。 6. **版本控制与依赖管理**:Maven的dependency management功能可以帮助我们管理项目间的依赖关系...
总结来说,"tomcat-redis依赖jar包"涉及到的是将Tomcat应用服务器与Redis缓存系统整合的过程,包括连接器选择、配置、缓存策略、性能优化、安全措施以及监控与故障排查等多个方面。正确地集成和使用这些jar包,能够...
`Tomcat` 作为主流的 Java Web 服务器,通常用于部署基于 `Spring` 的应用程序,而 `Netty` 是一个高性能、异步事件驱动的网络应用框架,特别适合于开发高效的长连接服务,如 `WebSocket`。 `WebSocket` 是一种在...
4. **Netty**:是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在分布式系统中,Netty可以用于实现高效的通信,如RPC(远程过程调用)或者消息队列等。 5. **Maven**:...
通过以上步骤,我们可以构建出一个强大的基于Java的后端服务架构,集成了Spring Boot的易用性、Dubbo的分布式服务治理和Netty的高性能网络通信能力。这种架构适用于大型、复杂的企业级应用,能够提供高效、稳定的...
由于压缩包文件名为"sample-spring-boot-netty-master",通常这是一个Git仓库的克隆,包含项目源码、配置文件和可能的测试代码。主要文件夹可能有`src/main/kotlin`(Kotlin源代码)、`src/main/resources`(配置和...
4. **配置Redis连接**:确保所有Tomcat服务器和Nginx都能连接到Redis服务器,这可能需要配置Redis服务器的网络访问规则,以及在应用服务器和代理服务器上配置相应的连接池。 5. **测试**:一旦配置完成,可以通过...
【Xcafe-Netty4SpringMVC-project】是一个创新性的项目,它将SpringMVC框架集成到了基于Netty的高性能网络应用服务器中。这个项目的核心目标是利用Netty的非阻塞I/O和事件驱动架构来提升Web应用程序的性能和可扩展性...
Spring Boot负责整体架构,Mybatis处理数据库操作,Redis实现数据缓存以提高性能,Netty4用于构建高性能的通信层,而Swagger2则帮助我们管理和展示API。这些技术的协同工作,使得开发高质量的现代Web应用程序变得...
7. **测试与优化**:进行功能测试和性能测试,根据测试结果对系统进行优化,例如调整线程池大小、心跳间隔等。 通过这样的组合,我们可以构建出一个高效、稳定的客服系统,不仅能满足大量用户的同时在线,还能保证...
Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在心跳检测中,Netty提供了低级的网络通信能力,如TCP/IP连接的建立、管理,以及数据传输的封装。 3. **心跳...
5. **测试**:启动Tomcat,运行你的应用,验证是否能成功连接到Memcached并进行数据操作。 **注意事项** - 在生产环境中,务必对Memcached进行适当的监控和管理,以保证其稳定性和性能。 - 需要考虑缓存一致性问题...
Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个聊天系统中,Netty作为WebSocket服务器,处理客户端的连接、数据传输和断开连接。WebSocket提供全双工...
3. **Netty**:Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在这里,Netty被用来处理WebSocket的底层通信,提供更高效的数据传输。 4. **Maven**:项目中的`....