代码:
1.可以利用超时异常,再结合break,让程序跳出本阶循环。而不中断程序的运行。一般是把serversocket ,socket 放在一个while循环中,当发生超时异常后,程序利用break跳过while内的代码块后继续运行。
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class Ser {
public static void main(String[] args) {
ServerSocket ss = null;
try {
ss = new ServerSocket(4000);
ss.setSoTimeout(1000); //serversocket accept()等待客服端连接超时
} catch (IOException e) {
throw new RuntimeException(e);
}
Socket sc = null;
try {
sc = ss.accept();
while (!sc.isClosed()) {
try {
sc.setSoTimeout(10); //socket read()读超时
InputStream is = sc.getInputStream();
int t = is.read();
String s = "";
while (((char) t != '^') && (t != -1)) {
s = s + (char) t;
t = is.read();
}
System.out.println(s);
}catch(SocketTimeoutException e){
System.out.println(1.1);
}
}
} catch (IOException e) {
System.out.println(2);
throw new RuntimeException(e);
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class Main {
public static void main(String[] args) {
boolean b=true;
while(b) {
ServerSocket ss = null;
try {
ss = new ServerSocket(4000);
ss.setSoTimeout(1000); //serversocket accept()等待客户端连接超时
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
Socket sc = ss.accept();
} catch (IOException e) {
// b=false;
break;
}
}
System.out.println(1);
}
}
2.利用socket流的读写异常跳出循环,让客户端监控服务器端口,下面的代码是如服务器不在线,客户端每隔1秒扫描服务器端口
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Test {
public static void main(String[] args){
while (true) {
System.out.println(6);
try {
Socket sc = new Socket("192.168.10.10", 4004);
System.out.println(1);
while (!sc.isClosed()){
try {
OutputStream os = sc.getOutputStream();
os.write(1);
}catch (IOException e){
System.out.println("服务器不在线,连接中");
break;
}
Thread.sleep(1000);
}
} catch (IOException e) {
System.out.println(2);
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}