java定时器超时后关闭socket出现socket closed 异常的问题

package my.start;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

//创建AutoStart类,让他实现ServletContextListener(服务程序上下文监听器)接口
//实现ServletContextListener接口需要重写contextDestroyed()和contextInitialized()两个方法
//记得要在web.xml文件中加入
//

// my.test.AutoStart

//
//这样,tomcat在启动时,就会同时调用该接口的contextInitialized()方法
//在contextInitialized()方法中,开启一个线程,用soket监听一个端口,从而实现TCP通信
public class AutoStart extends HttpServlet{

private static final long serialVersionUID = 1L;
private int soketPort = 9014;//要监听的服务器端口,可以根据需要进行修改
@Override
public void init() throws ServletException {
    // TODO Auto-generated method stub
    super.init();
    new MyThread().start();//创建一个MyThread线程对象,并启动线程
    System.out.println("开启监听线程");
}


//创建MyThread类,继承Thread方法

class MyThread extends Thread
{
//重写Thread类的run()方法,用来实现MyThread线程的功能
public void run()
{
//System.out.println("测试开始");
try {
ServerSocket ss = new ServerSocket(soketPort);
System.out.println("监听到"+(soketPort+"")+"端口");
while(true){
//System.out.println("已经创建soket");
//ss对象的accept()方法可以监听指定端口有没有TCP连接
//在没有TCP连接之前程序将阻塞在这里
Socket socket = ss.accept();
System.out.println("有客户端接入");
//监听到指定端口有TCP连接后,创建soket对象,程序不再堵塞,往下执行
//创建一个线程,去监听客户端通过TCP发来的数据
Thread sockThread=new SocketTherad(socket);
//启动线程
sockThread.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
int timeNum;
class SocketTherad extends Thread{ //继承Thread类来创建线程
Socket socket;
InputStream is;
OutputStream os;
boolean run_flag=true;//控制run()函数是否继续运行标志位

    Timer heartBeatTimer = new Timer(); //心跳包定时器
    private void startHeartBeatThread() {
        TimerTask heartBeatTask = new TimerTask() {
            public void run() {                 
                timeNum++;   
                System.out.println("timerNum="+(timeNum+""));   
                if(timeNum==2){//超时则关闭socket连接及定时器
                    try {
                        is.close();
                        os.close();//关闭输出流
                        socket.close();//关闭soket
                        run_flag=false;//跳出死循环
                        System.out.println("TCP连接断开");  
                        heartBeatTimer.cancel();//关闭定时器
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };
        heartBeatTimer.schedule(heartBeatTask, 10*1000, 10*1000);
    }

    public  SocketTherad(Socket socket) {
        this.socket = socket;//传递过来的soket参数赋予给socket对象
    }

    public void run() {//run()函数用来实现线程要完成的任务
        startHeartBeatThread();
        while(run_flag)
        {
            try {
                String str = null;
                is = socket.getInputStream();//获取输入流
                os=socket.getOutputStream();
                byte[] buffer = new byte[200];//数据缓冲区;
                int length=0;
                length = is.read(buffer);//读取接收到的数据流长度

                if(length != (-1)){//不是-1,说明读取到有效的数据
                    str = new String(buffer,0,length);//输入流转换成str字符串                      
                    System.out.print("收到数据:");
                    System.out.println(str);
                }
                else if(length == (-1)){//接收到数据长度为-1,说明客户端主动关闭了TCP连接
                    is.close();//关闭输入流
                    os.close();//关闭输出流
                    socket.close();//关闭soket
                    run_flag=false;//跳出死循环
                    System.out.println("TCP连接断开");  
                }                   
                buffer = null;
                System.gc();//垃圾回收
            } catch (IOException e) {
                e.printStackTrace();
            }   
        }
    }
}

}


0

1个回答

try {
is.close();
os.close();//关闭输出流
socket.close();//关闭soket----------此处是客户端的套接字关闭。而服务器套接字接收到客户端连接之后ss.accept();,会尝试一直保持连接,但是此处的客户端的套接字关闭服务器端是不知道的,所有肯定会报socket closed异常,表明连接终端(客户端的套接字关闭了)。这是正常情况。
如果不想看到,就把打印栈追踪信息那行删掉。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
针对套接字关闭异常:Socket closed解决方案
本文告诉大家,菜鸟在编程中如何解决Socket closed问题
FTP 文件上传过程出现 Socket Close 异常
问题原因![在这里插入图片描述](https://img-blog.csdnimg.cn/20190329140903520.png)nn这是项目中目前的版本 commons-net-3.0.jar 源码n发现在这里,n把输出流关闭了,n然后在这里抛出的异常,n导致没有return回结果,n然后换了个版本: commons-net-3.6.jar就可以了。nn...
synchronized:解决Socket并发执行时被关闭的问题
synchronized:解决Socket并发执行时被关闭的问题nn1.synchronized用法nnnsynchronized修饰方法nnnnnpublic synchronized void test() {nn }nnnsynchronized修饰代码块nnn synchronized(this) n { nn } nn2.synchronized...
一种解决Android进行蓝牙连接时发生socket已关闭或超时错误的方法
在进行树莓派与android蓝牙通信时遇到一个难以解决的错误:nnjava.io.IOException: read failed, socket might closed or timeout, read ret: -1nn这个错误是出现在:nn try {n mmSocket.connect();// This is a blocking ...
jmeter http 请求返回socket closed的解决办法
Socket closednnNon HTTP response code: org.apache.http.NoHttpResponseException (the target server failed to respond)n资料查询:https://wiki.apache.org/jmeter/JMeterSocketClosednnn问题原因:在JMeter下,发送http
socket is closed异常的原因及其解决方法
在一个有关socket的程序中,客户端出现了 socket is closed异常,我百思不得其解,并没有关闭socket啊。下面首先来分析一下这个异常出现的原因:该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。而造成socket关闭常见的有以下两种: n1、调用了.close()方法关闭socket n2、关闭了输入
socket 连接超时处理 java
之前很少做这种纯的socket编程,最近公司有项目需要跟pc端通信,自己定协议发报文,就写了一个简单的基于java socket的client。rn功能差不多了以后,发现一个问题,向pc端发报文时,pc端ip port 不通的情况下,会一直死等,等到天荒地老。这种情况我刚开始以为是代码出现了问题。rn之前的代码:rnrn                 Socket socket = null;r
客户端关闭,服务器端SocketException异常解决方案
关于客户端一关闭,服务器就提示SocketException:connection reset的实际解决方案。
JMeter并发测试遇到Socket closed错误解决方案
n n n JMeter并发测试遇到Socket closed错误解决方案nIntron最近在用 JMeter 测试服务的性能,并发测试的时候,当线程数超过500,就会出现 socket closed 的错误,在网上查阅了一番资料之后,找到了下面的解决方案:nn第一步,调整默认文件数n第二步调整HttpClient的IdletimeoutnnSolutionn调整文件...
Socket常见异常整理
java.net.SocketTimeoutExceptionnnnnjava.net.SocketTimeoutExceptionn02-25 20:18:03.856 13374-13390/com.example.studylog W/System.err: at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491)n02-2...
BluetoothSocket的close闪退问题记录
在断开连接时候,调用socket.close()方法,发现程序直接闪退了,只有简单的一行提示如下:rnrnrn断开连接关闭socket时候失败了。。。rnrnrn百度查了一波,发现也有人遇到类似的问题,但是都没有很清楚的说明什么原因和解决办法。rn我分析了下我的代码,感觉最大的可能就是socket的创建以及close的调用都是在直接在android的service中进行而造成的缘故,类似andro
如何解决 Socket 连接超时
最近两天 项目中其中一台IM服务器的IM验证出现问题,进行用户IM注册时出现连接超时问题;n重启服务后,可以进行用户的IM注册验证,没有出现超时问题;但是等到半个钟一个钟(时间不定);n结果还是会有连接超时问题,所有单单是重启解决不了问题,也不可能一有问题就去重启服务n问题一:n登录服务器后台,使用netstat -ant命令查看当前网络状态:(此图是禁用IPV6后截图)nnn发现,
python中socket异常的获得方法
1、python程序设计中,使用try和except来捕获异常n     try:n            ........n    except :n            ........n2、socket一共提供4中异常nnn3、例子
关于客户端断开连接后服务器抛出异常Connection reset
学习了socket  ,在做一个类似qq的c/s结构的聊天软件。发现了一个问题rn就是在客户端与服务器通信后,服务器为客户端开启一个线程,使用while(true)循环时刻监听是否有通信。rn在界面开启时没有任何异常,可是当界面关闭 就一直抛出异常了。rn开启线程代码如下:rnrnrn异常内容如下:rnrnjava.net.SocketException: Connection resetrnat
socket遇到错误直接退出原因和解决办法
原因:socket遇到错误时,默认将错误信息交给系统处理,而系统的处理办法一般是直接关闭整个应用,所以就会出现遇到错误程序直接关闭,比如客户端关闭,服务器还在给客户端发信息,就会出现发送失败,导致服务器也直接关闭的现象解决办法:把错误交给自己定义的函数处理 n先定义一个函数void Perr(int signum)n{n if(signum==SIGPIPE)n {n fpri
socket: 调用send 线程异常退出问题
 ssize_t send(int sockfd, const void *buf, size_t len, int flags);nn1.send 异常退出,flags可能设置为0了.如果是flag==0, 如果断开连接,这调用send,线程会异常退出.nn(1)解决方法设置以下flag, 或者重新处理SIGPIPE也可以解决.nnMSG_NOSIGNAL (since Linux 2.2)n ...
Jedis “Socket读取超时”导致“返回值类型错误”
从异常信息来看,首先是在'zadd'操作时出现"Socket读取超时异常",具体异常信息"JedisConnectionException:rn java.net.SocketTimeoutException: Read timed out"。rnrn出现异常后,会销毁这个阻塞的Jedis连接池对象(CustomShardedJedisPool.returnBrokenResource(Custo
Java解决Client Socket连接服务端超时问题
Socket中的异常和参数设置nn在Socket编程中,客户端常使用Socket socket = new Socket(ip, port); 来连接服务器,但是如果服务器无响应的话,客户端就会长时间的无响应,解决方法是设置Socket超时参数,如下:nnntry n{ n Socket mSocket = new Socket(); //实例化socket n So...
ServerSocket连接断开处理方式
ServerSocket连接断开处理方式概述:异常信息:之前有人给出的方案:代码分析场景分析1.建立Socket连接,底层就是TCP连接:2.发送数据2.断开连接n概述:nWebSocket是一种在单个TCP连接上进行全双工通信的协议。在我们应用的过程仲,客户端会出现无故断开的情况。这里提供一种连接断开的异常检测机制。n异常信息:n系统中出现的异常n2019-03-12 18:56:24,044 ...
android下socket编程问题:服务器关闭时,客户端发送请求的异常处理
我用socket分别创建了一个服务器和一个客户端。rr当服务器程序运行时,客户端和服务器发送接收数据是OK的。rr但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException。但这个时间间隔很久,要三到四分钟才会抛出这个异常的。刚开始还以为是死机了呢!rr我想在客户端做一个处理:如果服务器未开,要弹出一个提示框,然后结束当前程序。r请问怎么实现?rr附创建客户端的部分代码
【android学习】socket传输中,流的关闭
【问题重现】rn问题1:socket传输中,用流来缓存数据,为了防止内存泄漏以及资源的合理利用,流用完是应该关闭的,但是,一旦关闭流,socket也关闭。即只传输一次,socket就关闭了。rn问题2:流的关闭太过缓慢,影响用户体验。rn【问题解决】rn对于问题1,解决方案有很多。rn1)每次传输,接受完数据后,关闭流。socket也关闭了。再次使用,重新new新的socket,创建新的连接。这个
paramiko遇到的问题
1.跳板机invoke_shell().send如果费时操作的话会出现socket.timeout  比如:sleep 10    rn2.取得结果比较费劲 没发现规律  比如:find /usr/local/tomcat/webapps/admin/  name index.php获取的结果为'find /usr/local/tomcat/webapps/admin/ -name Insuran
Socket通信完整实例(心跳包,客户端断线重连,服务端超时断开客户端连接)
Socket通信完整实例(心跳包,客户端断线重连,服务端超时断开客户端连接)nnnn通用工具类nnnnpublic class SocketUtil {nn public static String ADDRESS = "192.168.1.123";n public static int PORT = 10086;nn /**n * 读数据n *n * ...
CXF客户端配置请求超时限制-SocketTimeoutException
rn在用cxf 开发webservice应用时,客户端老报rnrnjava.net.SocketTimeoutException: Read timed out rnrn原因为连接超时,google 参考链接rnrnSpring下设置CXF的WebService客户端超时时长 rnhttp://ajava.org/course/open/16514.html rnhttps://cwiki.ap...
C#中修改socket通信超时
关于C#中socket通信异常的超时时间问题nn由于工作需求经常会测试socks5或http代理IP是否可用,在没有自己编写代理程序之前一直使用的QQ上自带 n的测试软件,但是一旦IP和端口号不通的情况下,就会导致长时间的卡死现象,只有关闭QQ再次打开才能重新进行测试,于是今天了解一下原理记下来作为笔记。 nQQ测试如图: n n在网上找到了原因,socket通信的超时时间无法改变,在C#中就是C...
pycharm 调试模块 socket 中出现 错误 error 13
linux中设置 端口号大于 1024 即可
linux socket tcp server 解决客户端socket断开后, 服务器端进程退出的问题
当服务器监听并接受一个客户端链接的时候, 可以不断向客户端发送数据, 这时如果客户端断开socket链接, 服务器继续向一个关闭的socket 发送数据(send, write)的时候, 系统会默认对服务器进程发送一个SIGPIPE信号, 这个信号的默认动作就是终止当前服务器进程.rn所以为了解决客户端断开后导致服务器进程结束的问题, 使用如下方法忽略SIGPIPE信号.rnstruct siga
android Sockte、ServerSocket阻塞,不同步问题
从昨天搞到了现在,一直有问题,开始以为是线程通信问题,测试后发现不是,走了好多弯路。用两个真机模拟的,有时候没有LogCat,也不知道原因。rn有一次发现提示read(),readline(),查了一下readLine()函数,原来是没有数据时,readLine()一直阻塞,直到接收数据。 但是在另一端也是处于阻塞状态。rn 使用这个函数socket.shutdownOutput();   半关闭
Socket套接字编程(TCP编程异常处理)
在运行TCP并发服务器端代码时发现客户端退出时服务器端子进程产生了僵尸进程服务器端避免僵尸进程的方法通过忽略SIGCHLD信号,解决僵尸进程signal(SIGCHLD, SIG_IGN)。通过wait方法,解决僵尸进程signal(SIGCHLD, handle_sigchld);wait(NULL)。通过waitpid方法,解决僵尸进程signal(SIGCHLD, handle_sigchl...
Socket发送请求“超时”——接收数据方式引起的bug
Socket发送请求“超时”——接收数据方式引起的bugnn一、场景描述nnn前段时间对接某家银行的资管外围系统,测试环境测试通过,联调报告经银行风控部门审批通过,上线时出现严重问题(不能正常发送/接收请求):发送请求成功、接收数据失败并抛出SocketTimeoutException。n对接使用的技术:Socket(接触的两家银行(一家股份制商业银行、一家国有银行(四大行之一))的外
如何判断socket是否连接,异常断开拔出网线
setSoTimeout npublic void setSoTimeout(int timeout) n throws SocketException 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 nread() 将只阻塞此时间长度。如果超过超时值,将引
彻底解决关于CSocket类的Receive超时的问题
mfc socket 超时
gevent管理socket时容易忽略的错误
使用python的协程库gevent管理socket通信的时候出现了下列错误:n n raise _socketcommon.ConcurrentObjectUseError('This socket is already used by anothergreenlet: %r' % (watcher.callback, ))ngevent.hub.ConcurrentObjectUseErro
[JAVA]Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题
我在写一个Socket服务器时,使用了BufferedReader.readLine()的方法来读取消息,客户端用BufferedWriter.write()来写数据,但是注意到我发送的是"FFi"这个单元,但是在服务器接收到的却是"FFiFFiFFi",而且是在Scoket断开时一次性刷出来的。
C#中Socket.Receive()的超时问题
最近在调试程序的时候,希望1秒钟调用一次 Socket.Receive() 来接收数据。 n实际上,应该是说,如果没有数据到来,就是1秒钟一次,如果有数据到来,则收到数据后立即继续接收,然后继续是1秒钟接收一次。C#的相关代码如下:public bool ReadDataForMe(Socket sck, uint waitSec)n{n int rlen = 1;n DateTime
Android关于Socket通信异常的问题
用Socket通信写了一个很简单的聊天室,第一次运行时正常,但是当我再次运行的时候客户端就没反应了,但我改了端口号以后又可以通信了,让我纠结了好久。n   最后多方打听才知道
socket 请求 超时重试
public class ZzSocketClientUtil {n public static String water_no = "";n static final Map MAPS = new HashMap();n // socket超时重试时间n static final int TIMEOUT = Constant.socketTimeOut;n static {n  MA
java socket链接超时or拒绝链接
原因:ip或port错误rn           服务器自动防犯,拒绝链接rn           防火墙玩笑
linux socket用setsockopt设置了超时之后怎么取消
在网上没找到资料,索性用getsockopt把一个默认的socket的超时值读出来看看。我原来写的代码是设置接收超时,所以现在读取的时候也读的是接收超时。rn// get.cn#include /* See NOTES */n#include n#include n#include n#include nnint main()n{n struct timeval tv_out;
Socket服务端,长连接,心跳包,自动释放掉线资源,可扩展处理数据接口
头文:nn最近看网上写Sokect编程,好多都写的没法扩展,不能复用,既然是面向对象,就多多少少应该有面向对象的思想,所以自己下午写了一个,没优化,有不好的地方请指出.nn解析:nnSocket的基本原理这里就不讲了,只贴代码和解释代码,不会讲很细.nn大致分为四个部分,3个部分都是一个单独的线程.1个部分为哈希表共享资源nn服务模块:SocketService,用于接受客户端连接.nn检测模块:...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习socket java定时器学习