无法远程连接到服务器,error 10061

Alaska_Lee 南京思克奇网络科技有限公司 2015-10-23 04:35:14
我用spring mvc框架的,在controller中实现一个长轮询的接口,后台维持了一个队列结构,长轮询如果能从队列中取出结果则返回,如果没有则每隔1秒再取;


@controller
@requestMapping("/infopublish")
@Scope("prototype")
public class InfoPublishController{
@RequestMapping(value="/getsubscribeinfo.do",method=RequestMethod.GET,header="Accept=text/plain")
public @ResponseBody String GetSubscribeInfo(@RequestParam String userInfo){
return UserBox.GetInstance().GetUserInfo(userInfo);
}

@RequestMapping(value="/addsubscribe.do",method=RequestMethod.GET,header="Accept=text/plain")
public @ResponseBody String AddSubscribe(@RequestParam String userInfo){
if( UserBox.GetInstance().AddUserBox(userInfo))
return "true";
else
return "false";
}

@RequestMapping(value="/publishinfo.do",method=RequestMethod.POST,header="Accept=text/plain")
public @ResponseBody String PublishInfo(@RequestParam String userInfo, @RequestParam String info){
if( UserBox.GetInstance().PutInfoToBox(userInfo,info))
return "true";
else
return "false";
}
}


单例的UserBox类

public class UserBox{

//单例代码省略

private Map<String, Queue<String>> box;

public Boolean AddUserBox(String userId){
try{
synchronized(this){
if(box.containsKey(userId)){ return false;}
else{
Queue<String> userBox = new LinkedBlockingQueue<String>();
box.put(userId, userBox);
return true;
}
}
}
catch(Exception e){return false;}
}

public String GetUserInfo(String userId){
if(!box.containsKey(userId)) return "";
else{
try{
while(box.get(userId).size()==0){
Thread.sleep((long)1000.0);
}
String message = box.get(userId).poll();
return message;
}
catch(Exception e){return "";}
}
}

public Boolean PutInfoToBox(String userId, String infoJson){
try{
synchronized(this){
if(!box.containsKey(userId)) return false;
else{
Queue<String> userBox = box.get(userId);
userBox.offer(infoJson);
return true;
}
}
}
catch(Exception e){return false;}
}
}


客户端用C#语言调用了通过httpwebRequest调用controller中的接口:

while(true){
string url="";
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://localhost:8080/infopublish/getsubscribeinfo.do?userInfo="+args[0]);
myRequest.Method = "GET";
myRequest.ContentType = "text/plain:charset-UTF-8";
//myRequest.Timeout = 5000;
//Stream newStream = myRequest.GetRequestStream();//这里提示无法连接到远程服务器
//newStream.Close();
HttpWebResponse res = (HttpWebResponse)myRequest.GetResponse();
stream responseStream = res.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
string backstr = sr.ReadToEnd();
sr.Close();
responseStream.close();
res.Close();
console.writeline(backstr);
}


我开启了120个这样的客户端,2个发布消息的客户端,每隔1秒调用publishInfo接口随机向120个用户发布消息,一开始120个客户端都能及时的收到,但是隔一会客户端会报超时异常,这个是正常的,之后偶尔还能收到信息,但是再过一会每个客户端就出现无法连接远程服务器,error 10061目标主机主动拒绝,连接不能建立。
关掉所有客户端,重启1个新的客户端仍然是这样,但是服务端没有报任何错误。
还请大侠帮忙分析下,是不是服务端连接太多有限制啊,还是服务端出现了太多了超时链接后干脆拒绝了所有请求?
...全文
397 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Alaska_Lee 2015-10-29
想到了最简单的解决方法: 1、轮询时间设置限制,在tomcat的超时范围内,不管有没有结果都返回。 2、轮询设置次数限制,当然总时间也得在tomcat设定的超时范围内。
回复
Alaska_Lee 2015-10-26
引用 5 楼 u010842704 的回复:
耗进连接数了,建议你用连接池处理这样的问题
对的应该是耗尽连接数了,我想问下是不是在controller中出现异常(超时异常)链接并不断掉,才会导致连接数耗尽的? 另外我用的tomcat容器,应该自带了连接池吧,那我在spring mvc框架上如何使用连接池技术,有文章推荐吗?我在网上搜到的都是数据库连接池的文章!
回复
Alaska_Lee 2015-10-26
引用 4 楼 wrong1111 的回复:
建议看看TCP/IP 的长链接。。 你知道为什么很多高可用性的解决方案需要加心跳机制么? 解决的就是这现在这样的场景。。
TCP/IP的长连接我知道,但是我这边没有那么底层啊,处理的还是在http这层,并且spring mvc把这些请求都已经封好了,我是想在spring mvc的基础上实现长轮询或者长连接!
回复
好学者007 2015-10-23
耗进连接数了,建议你用连接池处理这样的问题
回复
wrong1111 2015-10-23
建议看看TCP/IP 的长链接。。 你知道为什么很多高可用性的解决方案需要加心跳机制么? 解决的就是这现在这样的场景。。
回复
兔子托尼啊 2015-10-23
应该是请求多了,处理不过来。并发问题。
回复
Alaska_Lee 2015-10-23
引用 1 楼 rui888 的回复:
服务端停止响应,停止工作了。具体原因不知道。资源耗尽没释放?网络问题?等等。 网上找找看看排查。
我隔了一会,就是把这个帖子发完的功夫(时间蛮长的),又可以连了,这次只开了50个。
回复
兔子托尼啊 2015-10-23
服务端停止响应,停止工作了。具体原因不知道。资源耗尽没释放?网络问题?等等。 网上找找看看排查。
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2015-10-23 04:35
社区公告
暂无公告