websocket 101错误编程,怎么知道程序错误退出的原因

博客访问: 26971
博文数量: 5
博客积分: 1400
博客等级: 上尉
技术积分: 60
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 系统运维
&& &已处于连接状态的两个TCP通信端,如果有其中一端关闭了socket,另一端将会有以下情况:(1)如果对方读取该socket,则会返回0;(2)如果对方往这个socket写,则会产生一个信号异常(unix/linux的管道异常),但是这个异常并不会立刻提示,在第一次写入时,写函数是有返回的,而且是正确的返回,这应该是跟socket的选项有关,而第二次再往socket写数据时,这个异常就会立刻抛出。由此一来,便不能立刻得知socket已关闭。&& &为了能够立刻知道socket的状态,可以使用linux的poll或者是select,在unp有介绍,可以使用poll函数。当对方关闭了socket后,会想socket放送一个rst信号,这是使用poll或者是select函数轮询这个socket时,便会有一个状态改变返回,使用poll将会在pollfd的revents分量返回一个值,这个值有可能是POLLIN或者是POLLERR分别代表可读和出错,这时我们去读这个socket,再根据返回值判断就可以得知状态了。通常在使用tcp进行双连接通信时,socket的一端只负责读或者写,负责读的一端可以立刻知道socket的关闭,但是socket的写一端却不能立刻知道,可以使用在写端检测POLLIN或POLLERR信号,来判断socket的连通性。//检测socket是否正常连通int sock_poll(int socket,int timeout){ char buffer[1024]; struct pollfd socks[1]; socks[0].fd = socks[0].events = POLLIN; int nready = poll(socks,1,timeout); logdown(ERROR,"socks[0].revents:%d\n",socks[0].revents); if(socks[0].revents & (POLLIN | POLLERR))//如果本端只负责写入数据到&& & & & & & & & & & & & & & & & & & & & //soecket,从不向socket&& & & & & & & & & & & & & & & & & & & & //读取数据,且对方只从socket读取数 & & & & & & & & & & & & & & & & & & & & & &//据,从不向socket写数据,则说明了&& & & & & & & & & & & & & & & & & & & & //socket有异常数据到达,读取再判断 {
int res = read(socks[0].fd,buffer,1024);
if(res < 0)
logdown(ERROR,"network error:%d,%s\n",errno,strerror(errno));
else if(0 == res)//等于零则说明是一个rst信号,对方关闭了socket
logdown(MESSAGE,"socket has been closed\n");
logdown(ERROR,"unknow error:%s\n",strerror(errno)); } printf("ERRNO:%s\n",strerror(errno)); return 0;}
阅读(1639) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。用Mina开发Socket服务器总有一些不可预知的奇怪现象?程序结束不了?! - ITeye问答
最近在用 Java的Socket框架mina开发一个服务器端程序,服务器写完后,用mina的客户端API写了程序去连接服务器端,也连接成功了,但是发现每次客户端连接完成运行后 过1分钟客户端程序才结束! 经过调试发现代码已经执行了客户端代码的最后一行! 真是奇怪,客户端代码如下:
public class Client
private static final String HOSTNAME = "localhost";
private static final int PORT = 20000;
public static void main( String[] args ) throws Throwable
SocketConnector connector = new SocketConnector();
// Configure the service.
SocketConnectorConfig cfg = new SocketConnectorConfig();
cfg.getFilterChain().addLast(
new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT), new ClientSessionHandler("Hi hi :("), cfg);
future.join();
session = future.getSession();
} catch (RuntimeIOException e) {
System.err.println("Failed to connect.");
e.printStackTrace();
// wait until the summation is done
session.getCloseFuture().join();
System.out.println(session,"### all done!
"### all done!
!" 明明都已经打印出来了! 但是发现进程中还是有一个 javaw.exe! 而且用进程管理工具无法结束!,过了1分钟后,这个javaw.exe就没有了,发现eclipse的控制台红色结束按钮也变灰色了. 这些居然都是在最后一行代码执行完发生的? 感觉Java真是一个不稳定的东西~~ 问题补充多谢回复,我看2.0是M版本,好像下载上面写着 unstable,所以没有用,你用这个版本感觉稳定吗?
我刚才又试验了一下 quickServer,试验socket连接到达100个居然就Connnectin refused了? 好像根本没有使用 非阻塞队列. mina虽然有我刚才说的问题,但是他却能坚持到 1000个连接没有发生 Connnectin refused的错误,说明他还是利用了线程池重用了很多连接,我现在马上试试 mina2.0! 我用的是1.1.7,connector没有dispose方法,那个例子我也看到了问题补充还有你知道他的 httpserver怎么用吗? asyWeb合到mina里面了,我看了例子"httpserver",但是里面居然没有客户端调用示例.客户端怎么传递参数到http服务器也没有说明问题补充我试了一下2.0M果然可以. 但是服务器端好像不能自己设置连接池了? 下面的代码在2.0不能用,你们怎么用连接池的? 我的性能是要求一台服务器机器需要有1000个并发连接. 我现在服务器这样写不知道有没有问题:
ExecutorService executor = Executors.newFixedThreadPool(1000);
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.setHandler(
new TimeServerHandler() );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
acceptor.getFilterChain().addLast("executor",
new ExecutorFilter(executor));
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast(
new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
acceptor.bind( new InetSocketAddress(PORT) );
客户端很简单,就是模拟1000个并发连接:
public static void main( String[] args ) throws Throwable
for(int i=0;i&1000;i++){
("Enter run l..."+i);
new Thread(new ClientThread(i)).start();
每个客户端代码是:
public void run() {
// TODO Auto-generated method stub
("#### thread :"+this.num+" Running...");
NioSocketConnector connector = new NioSocketConnector();
// Configure the service.
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
connector.getFilterChain().addLast(
new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
connector.getFilterChain().addLast( "logger", new LoggingFilter() );
connector.setHandler(new ClientSessionHandler(" hihi new!"));
for (;;) {
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT));
future.awaitUninterruptibly();
session = future.getSession();
} catch (Exception e) {
System.err.println("Failed to connect.");
e.printStackTrace();
// wait until the summation is done
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
("#### thread :"+this.num+" over ...");
不知道这样写是不是已经用了NIO特性和数量是1000的连接池了. 而且我发现客户端如果不用mina的API,直接用Socket API连接,服务器撑不到1000个,200多个就Connection refused了.问题补充刚才试验了一下,模拟1000个客户端连接,成功了931个,异常是:
02:18:06,968 ERROR (LoggingFilter.java:127) - EXCEPTION :
java.io.IOException:
您的主机中的软件放弃了一个已建立的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:180)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:568)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:547)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:539)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:57)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:867)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:65)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
不知道调整哪些参数可以不发生这个错误? 就是说调整什么可以使1000个连接都能连上问题补充windows需要修改OS的一个设置,但是设置了也不起作用,我再试试吧! java的NIO的目的是使服务器端打开尽量少的Socket连接,能处理尽可能多的客户端请求(不知道主要是非阻塞队列起作用还是那个concurrent线程池在发挥作用,应该是前者),这样理解没错吧?
采纳的答案
mina 1.1.x版本貌似是 session.close();对应的方法定义是:&& CloseFuture close();mina 2.0更简单好用。不过我们不是直接用。是参考2.0做了些裁减。mina的性能没什么可担心的,成功案例有:openfire可以google一下:openfire connection manager
wanghelong 写道没有用那个方法 ,用了框架,你还用得到socket干什么呢?
用的whalin 的MemCached的client
他使用了SocketChannel来获得socket
结果在jdk1.5,1.6,red hat下出现了pipe泄露
没有用那个方法 ,用了框架,你还用得到socket干什么呢?
你们用SocketChannel获得socket的时候如果设置了timeout
难道都没碰到file descriptor leak的问题?
mina我已经在生产环境中使用了,效果非常好,目前没有发现大的问题。
引用比如像短信网关这种应用,即发送一个请求出去,然后得到一个响应,消息都不长,大概几十个字节。像这种应用,setReceiveBufferSize和setSendBufferSize是应该设置的较大一点好,还是较小一点好呢?
sendBuffer的作用是已发送数据在发送端的副本,主要用来出错/超时重传
receiveBuffer是已接受的数据存放的地方,然后依次从内核空间拷贝到应用
两个都应该设大点好吧,理论上最大是65535-TCP头-IP头,不过不同的网络不一样
引用"问下 做什么应用时要用到 mina 2.0呀~~ "
什么应用用短连接的socket,比如http server什么的,又想能支持c10k这个连接数的,长连接client数量有限传统io每连接每线程的模型应该够用,所以这种情况也没必要非用nio,不过自己有能力写还是自己写好
codeutil 写道mina 1.1.x版本貌似是 session.close();
对应的方法定义是:&& CloseFuture close();
mina 2.0更简单好用。不过我们不是直接用。是参考2.0做了些裁减。
mina的性能没什么可担心的,成功案例有:openfire
可以google一下:openfire connection manager
mina2.0 unstable,所以一直都没敢用,也没看有什么不同,听说是简化了接口。你们做了哪些裁剪?对mina的读写算法和bytebuffer的控制是否做了什么优化吗?
另外问一下,
比如像短信网关这种应用,即发送一个请求出去,然后得到一个响应,消息都不长,大概几十个字节。像这种应用,setReceiveBufferSize和setSendBufferSize是应该设置的较大一点好,还是较小一点好呢?
lyo 写道刚才试验了一下,模拟1000个客户端连接,成功了931个,异常是:
02:18:06,968 ERROR (LoggingFilter.java:127) - EXCEPTION :
java.io.IOException:
您的主机中的软件放弃了一个已建立的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:180)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:568)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:547)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:539)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:57)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:867)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:65)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
不知道调整哪些参数可以不发生这个错误? 就是说调整什么可以使1000个连接都能连上
这个异常是连接被断开了。你可以设置一下mina服务端的backlog,设置一个较大的值。
你是在什么操作系统上运行的,如果是64位solaris的话,单个进程打开文件最多是65536个,所以足够用,不需要修改。如果是32位或者是windows,默认值是多少我记不清了,你可以查一下,你要建立的连接的数量不能超过操作系统的限制。
引用最近在用 Java的Socket框架mina开发一个服务器端程序,服务器写完后,用mina的客户端API写了程序去连接服务器端,也连接成功了,但是发现每次客户端连接完成运行后 过1分钟客户端程序才结束! 经过调试发现代码已经执行了客户端代码的最后一行!
这个是因为SocketConnector会启动一个worker线程用来监听网络上的事件。每秒中轮询一次,默认的超时时间就是1分钟。可以通过setWorkerTimeout(int workerTimeout)来设置这个超时时间。
* Set how many seconds the connection worker thread should remain alive once idle before terminating itself.
* @param workerTimeout the number of seconds to keep thread alive.
Must be &=0.
If 0 is specified, the connection
worker thread will terminate immediately when
there's no connection to make.
public void setWorkerTimeout(int workerTimeout) {
if (workerTimeout & 0) {
throw new IllegalArgumentException("Must be &= 0");
this.workerTimeout = workerT
private class Worker implements Runnable {
private long lastActive = System.currentTimeMillis();
public void run() {
Selector selector = SocketConnector.this.
for (;;) {
int nKeys = selector.select(1000);
registerNew();
if (nKeys & 0) {
processSessions(selector.selectedKeys());
processTimedOutSessions(selector.keys());
if (selector.keys().isEmpty()) {
//检查是否超时
if (System.currentTimeMillis() - lastActive & workerTimeout * 1000L) {
synchronized (lock) {
if (selector.keys().isEmpty()
&& connectQueue.isEmpty()) {
selector.close();
} catch (IOException e) {
ExceptionMonitor.getInstance()
.exceptionCaught(e);
} finally {
SocketConnector.this.selector =
lastActive = System.currentTimeMillis();
} catch (IOException e) {
ExceptionMonitor.getInstance().exceptionCaught(e);
Thread.sleep(1000);
} catch (InterruptedException e1) {
ExceptionMonitor.getInstance().exceptionCaught(e1);
是啊,我也想知道什么应用需要MINA呢?难道是SE方面的应用?
问下 做什么应用时要用到 mina 2.0呀~~
Socket连接是不可能少的,少了就是断开连接了。nio是异步读取Socket流中和异步写入数据。避免了线程浪费在读写的等待上面。就像酒店的服务员,聪明的服务员会让你先看菜单,等你想好点什么了再叫他来点菜,而不聪明的服务员,是从你一进店就守着你,直到你点好菜,像这种服务员一天服务不了多少顾客。
2.0的api变化较大,写法和1.0不一样,你参考官方代码吧。服务器撑不到连接应该是服务器的限制,linux是有打开文件的最大个数限制的,貌似windows也有,我没了解windows的。引用:修改linux最大连接数1、直接用ulimit命令ulimit -n 81922、修改/proc/sys/net/ipv4/ip_conntrack_max为8192或者是/etc/sysctl.conf中加入ip_conntrack_max=81923、请首先编辑/usr/include/bits/types.h 文件,改变__FD_SETSIZE 的值:#define _ _FD_SETSIZE 8192下一步,使用这个命令增加内核文件描述符的限制:# echo 8192 & /proc/sys/fs/file-max最后,增加进程文件描述符的限制,在你即将编译squid 的同一个shell 里执行:sh# ulimit -Hn 8192该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。
asyncWeb虽然被整合到mina,但是好像作者没时间更新asyncweb 的代码,asyncweb 好像没法用新版的mina的jar,我很久没关注这个了。
相关例子在 mina 的 example中:https://svn.apache.org/repos/asf/mina/tags/2.0.0-M4/example/src/main/java/org/apache/mina/example/chat/client/SwingChatClient.java
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
client.quit();
connector.dispose();
dispose();
setLoggedOut();
setDefaultCloseOperation(EXIT_ON_CLOSE);
如果你用的是mina 2.0.0-M4,那么你是漏了一行代码:
connector.dispose();
其它版本的mina对应调用方法类似,可能叫close方法。只要额外启动了线程而线程还没执行完,且程序没有调用System的exit,则程进程序会一直存在。例如启动了swing的时候因为有了后台线程需要显式的调用System的exit才能退出,或者就是使用了ThreadPoolExecutor之类的线程池而没有调用shutdown或shutdownNow,导致看上去代码执行到了最后一行而程序没有退出。以及其它启动了类似run方法写成 while(true)之类的线程。而楼主的一分钟退出,是因为socket被服务端超时断开了,客户端异步的线程很仔细完毕才让程序自动退出。这个和“Java真是一个不稳定的东西”扯不上半点关系。
已解决问题
未解决问题2012年12月 .NET技术大版内专家分月排行榜第三
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。socket异常及原因分析 - CSDN博客
socket异常及原因分析
Connection reset by peer&
web 程序的服务器段,在链接数据库的时候被同一个“对等点”重置了。对等点重置的意思其实就是被同一个权限相同的管理员或者是程序给强制占用了权限,好像目前 连接被断了一样,实际上这个时候连接并没有断开,是被“重置”了。就是能找到连接,但程序之间比较笨,自己找不到失去的那个连接了。&
“连接被对等点(peer)重置”,这时,只要把防火墙关闭就好了。就是说暂时找不到那个以前的连接了,也许断了,也许没有断,但就是找不到。
10053 您的主机中的软件放弃了一个已建立的连接。&
//////////////////////////////////////////////&
一个以建立的连接被用户的主机上的软件终止,可能是因为一次数据&&&&
传输超时或者是协议错误。还有就是不要再连接事件中发送消息
总结一下:&
1.你的socket队列中没有空间了&
2.receiver never acknowledges data sent on a datastream socket(接受者不承认在数据流接口上发送的数据)
3.A connection will timeout if the local system doesn't receive an (ACK)nowledgement for data sent
Connection reset by peer&
抛出的异常也有可能是客户端中断连接。 当客户端中断连接的时候服务器也会抛出这个异常出来。
就是说客户端正在连接的时候 突然终止 了连接,这样,服务器端会抛出Connection reset by peer 异常出来
第 4个异常是java.net.SocketException: (Connection reset或者 Connect reset by peer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常 (Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection
reset)。简单的说就是在连接断开后的读和写操作引起的。
我这里有关于网络异常方面的建议,发上去大家学习:&
第 1个异常是java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型&#20540;)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监 听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。
第 2个异常是java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行 new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端 口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能 ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。
第3个异常是java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
第 4个异常是java.net.SocketException: (Connection reset或者 Connect reset by peer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常 (Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection
reset)。简单的说就是在连接断开后的读和写操作引起的。
第5个异常是 java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对 方关闭连接后自己也要关闭该连接。
客户端错误代码10053 Software caused connection abort(软件原因导致连接中断)
又涉及到一个问题就是阻塞函数和非阻塞函数,阻塞Socket和非阻塞Socket
一 是阻塞函数,一是非阻塞函数。所谓阻塞函数,是指其完成指定的任务之前不允许程序调用另一个函数,在Windows下还会阻塞本线程消息的发送。所谓非阻 塞函数,是指操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回
Connection&reset&by peer的原因:&
经常出现的Connection&reset&by peer: 原因可能是多方面的,不过更常见的原因是:&
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;&
②:客户关掉了浏览器,而服务器还在给客户端发送数据;&
③:浏览器端按了Stop&
很多人都说是客户端造成的,没有办法控制,是个比较郁闷的问题。
引起该问题的原因是由于此时Server端连接已经被复位,而Client依然通过该连接在接收和发送数据,在网上搜索了一下该错误,发现该错误引起的原因大都是防火墙的原因,嘿嘿,又学了一招。
Windows Sockets Error Codes
socket 通信有通信的规则,&& 如果你希望保持长连接,&& 就应该有个通信协议,&& 包括写入\0也是规则的一部分,&& 传完一个文件等待下一个.&& 要可不保持长连接,&& 可使用webservice,&& 这样你的协议变的更为可读,&& 更容易包装成产品.&&&
看你的程序希望read结束,&& 不象是希望保持长连接的样子,&& 晕ing
经常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:&
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;&
②:客户关掉了浏览器,而服务器还在给客户端发送数据;&
③:浏览器端按了Stop&
很多人都说是客户端造成的,没有办法控制,是个比较郁闷的问题。
这是网络连接断掉引起的,一般是由于通过了防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会切断这个TCP的session,这时就会导致Connection reset by peer error
附加该问题的最近结论
1.我使用MyEclipse单步调试,当调试到inputStream 的时候,看变量,发现一个问题,
那就是SocketInputStream的Channel是null,为什么那,我不知道
又在网络上找到几句话粘贴到这里吧!如下
&No buffer space available , recv failed&
谢谢sandyen(杉叶)的回答,我在网上也搜到这个,但是不是这个原因。
问题已解决,确实不是程序的问题。
-an发现有大量的端口占用,监听很多机器的139,445端口。
确定机器中了震荡波,下载补丁安装重启,问题解决。
导致这个异常的原因应该是系统的socket大量的资源被占用,
导致没有足够的资源接收前台上报或者回复的数据。
http://topic.csdn.net/t//4615627.html
本文已收录于以下专栏:
相关文章推荐
原博客地址:.cn/s/blog_4b6f8d1501017tqa.html
第1个异常是java.net.BindException:Address alr...
java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题。希望大家有所帮助。那么我们就来看看有关java.net.SocketExceptio...
最近使用Xshell使用服务器,经常连接上使用一会就会被自动中断,很是闹心,并且出现以下的错误提示:Socket error Event: 32 Error: 10053.
Connection cl...
贴2段能稳定重现10053的代码,下面是客户端:
WSADATA WsaD
VersionRequested = MAKEWO...
客户端使用200个线程往服务器端发送数据,每次数据量约100K.
发送的时候使用了多线程连接池管理器
private MultiThreadedHttpConnectionMa...
错误原因是:WSAECONNABORTED (10053) Software
connection
因软件原因导致连接终止 An
established...
SocketTimeoutException:
一、简介:
SocketTimeoutException:指的是服务器响应超时
直接继承自java.io.InterruptedIOException,...
最近拿到一个工程,不停的报socket write error,虽然不影响正常使用,但是真的很烦,而且会影响日志的记录.所以决定找到这个问题的答案:
excepion的堆栈信息如下:
Connection reset by peer: socket write error错误分析:常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: ...
一、在java网络编程Socket通信中,通常会遇到以下异常情况:
第1个异常是 java.net.BindException:Address already in use: JVM...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 socket 10061错误 的文章

 

随机推荐