java判断socket是否连接_java判断socket是否连接

本文介绍了如何使用Java中的socket.sendUrgentData方法来判断socket连接是否断开。当发送紧急数据时,如果对方未开启SO_OOBINLINE属性,Java会抛出异常,从而得知连接状态。示例代码展示了一个包含初始化、读写数据和重新连接逻辑的Nksocket类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

be3690cf1dd3878fba5a41f28d32a545.png

在socket类中有一个方法sendUrgentData,它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节(在Java 中是抛出异常),而SO_OOBINLINE属性默认情况下就是关闭的。推荐:java视频教程

示例:public class Nksocket extends Thread{

public String ip=null;//连接服务器的IP

public Integer port=null;//连接服务器的端口

private Socket socket=null;//套节字对象

private boolean close = false; // 关闭连接标志位,true表示关闭,false表示连接

private Integer sotimeout=1*1*10;//超时时间,以毫秒为单位

//------------------------------------------------------------------------------

public Nksocket(){

init();

}

public Nksocket(String ip,Integer port){

setIp(ip);

setPort(port);

init();

}

/**

* 初始化socket对象

*/

public void init(){

try {

InetAddress address = InetAddress.getByName(getIp());

socket = new Socket(address,getPort());

socket.setKeepAlive(true);//开启保持活动状态的套接字

socket.setSoTimeout(sotimeout);//设置超时时间

close=!Send(socket,"2");//发送初始数据,发送成功则表示已经连接上,发送失败表示已经断开

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e){

e.printStackTrace();

}

}

/**

* 读数据线程

*/

public void run() {

while(true){

//---------读数据---------------------------

close = isServerClose(socket);//判断是否断开

if(!close){//没有断开,开始读数据

String readtext = ReadText(socket);

if(readtext!=null && readtext.trim().length()>0){

System.out.println("读取数据:"+readtext);

}

}

//---------创建连接-------------------------

while(close){//已经断开,重新建立连接

try{

System.out.println("重新建立连接:"+getIp()+":"+getPort());

InetAddress address = InetAddress.getByName(getIp());

socket = new Socket(address,getPort());

socket.setKeepAlive(true);

socket.setSoTimeout(sotimeout);

close = !Send(socket,"2");

System.out.println("建立连接成功:"+getIp()+":"+getPort());

}catch(Exception se){

System.out.println("创建连接失败:"+getIp()+":"+getPort());

close=true;

}

}

}

}

/**

* 发送数据,发送失败返回false,发送成功返回true

* @param csocket

* @param message

* @return

*/

public Boolean Send(Socket csocket,String message){

try{

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

out.println(message);

return true;

}catch(Exception se){

se.printStackTrace();

return false;

}

}

/**

* 读取数据,返回字符串类型

* @param csocket

* @return

*/

public String ReadText(Socket csocket){

try{

csocket.setSoTimeout(sotimeout);

InputStream input = csocket.getInputStream();

BufferedReader in = new BufferedReader(new InputStreamReader(input));

char[] sn = new char[1000];

in.read(sn);

String sc = new String(sn);

return sc;

}catch(IOException se){

return null;

}

}

/**

* 判断是否断开连接,断开返回true,没有返回false

* @param socket

* @return

*/

public Boolean isServerClose(Socket socket){

try{

socket.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信

return false;

}catch(Exception se){

return true;

}

}

/**

* 测试

* @param ags

*/

public static void main(String[] ags){

Nksocket nksocket = new Nksocket("127.0.0.1",8090);

nksocket.start();

}

//------------------------------------------------------------------------------

public String getIp() {

return ip;

}

public void setIp(String ip) {

this.ip = ip;

}

public Integer getPort() {

return port;

}

public void setPort(Integer port) {

this.port = port;

}

}

更多java知识请关注PHP中文网java基础教程栏目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值