javasocket长连接究竟是怎么一回事?
现编这个就是个多线程服务器,只要在client不释放连接,服务器端的run里边写while(TRUE)循环,那么就可以长期连接。class ConnectionThread extends Thread{Socket client;int counter;public ConnectionThread(Socket cl,int c){client = cl;counter= c;} @Overridepublic void run(){ try{ String destIP=client.getInetAddress().toString()
; int destport =client.getPort()
; PrintStream outstream=new PrintStream(client.getOutputStream())
; DataInputStream instream=new DataInputStream(client.getInputStream())
; String inline=instream.readLine();
}//trycatch(IOException e){System.out.println(e);}}//run
如何判断socket的连接状态?
法一:当recv()返回值小于等于0时,socket连接断开。但是还需要判断errno是否等于EINTR,如果errno==EINTR则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
法二:structtcp_infoinfo;intlen=sizeof(info);getsockopt(sock,IPPROTO_TCP,TCP_INFO,&info,(socklen_t*)&len)
;if((info.tcpi_state==TCP_ESTABLISHED))则说明未断开else断开法三:若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。
法四:intkeepAlive=1;//开启keepalive属性intkeepIdle=60;//如该连接在60秒内没有任何数据往来,则进行探测intkeepInterval=5;//探测时发包的时间间隔为5秒intkeepCount=3;//探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.setsockopt(rs,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive))
;setsockopt(rs,SOL_TCP,TCP_KEEPIDLE,(void*)&keepIdle,sizeof(keepIdle))
;setsockopt(rs,SOL_TCP,TCP_KEEPINTVL,(void*)&keepInterval,sizeof(keepInterval))
;setsockopt(rs,SOL_TCP,TCP_KEEPCNT,(void*)&keepCount,sizeof(keepCount));设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误