Client在通过main方法for循环执行上传到Server(main方法启动),文件量不会出现丢失,比如上传1000个,服务端会获取到1000个,也不会出现连接超时等问题;
但是将Client集成到Web(spring+springmvc)服务中,高并发测试上传会出现有时文件丢失,比如Client上传1000个文件,可能Server(main方法启动)就只获得了900多个,当我关闭Server,Client日志就会出现“远程服务器关闭了连接....”的报错信息。请问一下这是什么原因导致的?

解决方案 »

  1.   

    怎么集成的?建议是自启动servlet+单例+netty服务
    什么服务器操作系统?操作系统做优化了吗?很可能是服务器最大文件数/线程数限制导致
    参考:
    https://blog.csdn.net/gatieme/article/details/51058797  
      

  2.   

    谢谢您的回复!服务器是JBOSS4,只是把netty客户端代码放到了web项目中,前台页面触发上传文件,测试时模拟高并发,会出现一些上传超时,服务器没有得到一些文件。但是用main方法启动不会出现问题。您说的“自启动servlet+单例+netty服务”,是指访问一个servlet让他触发客户端对服务器的请求吗?具体是怎么做呢?
      

  3.   


    服务器同时做客户端经常会出现的问题是,没有tcp可用。一个IP最多可以有65536个客户端TCP连接,而通过异步IO接入的服务器连接可能趋势上10w先在服务器上直接跑main方法,是否有问题?并发要求会不会超过5w/ip(65536是理论值,5w是实际可用的)
    如果并发只是1000这个数量级,那就查文件传输的客户端一侧。一个web请求,一个client上传请求,最大的问题是线程限制导致客户端连接阻塞,看看web请求的最大值是多少,检查jboss4中的最大请求数,启动脚本的jvm参数的线程栈大小(限制了线程数量)最好的解决办法是异步+线程池。
    异步最简单的实现是使用jms,mdb中做上传处理
    自启动servlet就是增加了属性<load-on-startup>1</load-on-startup> 可以用它在应用包(war中)写一个线程池。