Socket中会有两种超时时间,分别为:socket.connect(endpoint,3000);
和socket.setSoTimeout(3000);
此两种超时时间有和区别呢?
socket.connect(endpoint,3000);连接的超时时间
- 尝试3秒,三秒连不上报错。(不指定的话默认是无限,但是也会有个超时时间,不会一直等下去。)
// 客户端
public class ClientSocket {
public static void main(String[] args) throws IOException {
SocketAddress endpoint = new InetSocketAddress("182.207.155.166", 11111);
//SocketAddress endpoint = new InetSocketAddress("127.0.0.1", 11111);
Socket socket = new Socket();
socket.connect(endpoint,3000);
// socket.setSoTimeout(3000);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好,你能收到我的消息吗?".getBytes());
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
String str = new String(bytes, 0, read);
System.out.println(str);
outputStream.close();
socket.close();
}
}
//服务器端
public class ServerSocketTest {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(11111);
while (true) {
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
byte[] bytes =new byte[1024];
int read = inputStream.read(bytes);
System.out.println(new String(bytes,0,read));
Thread.sleep(4000);
OutputStream outputStream = accept.getOutputStream();
String str = "{"+new String(bytes, 0, read)+"}<---我能收到";
outputStream.write(str.getBytes());
}
}
}
执行结果分析:
- 此时客户端是无法连接到(“182.107.155.166”, 11111)该IP端口为不存在的。
- 此时设置超时时间为客户端等待连接服务端的时间,3秒内连接不上报错。
Exception in thread “main” java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.weidd.best.sockettest.ClientSocket.main(ClientSocket.java:22)
socket.setSoTimeout(3000);设置接收响应的时间
- 等待3秒,3秒内服务端未响应,报错。
public class ClientSocket {
public static void main(String[] args) throws IOException {
// SocketAddress endpoint = new InetSocketAddress("182.107.155.166", 11111);
SocketAddress endpoint = new InetSocketAddress("127.0.0.1", 11111);
Socket socket = new Socket();
socket.connect(endpoint,3000);
socket.setSoTimeout(3000);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好,你能收到我的消息吗?".getBytes());
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
String str = new String(bytes, 0, read);
System.out.println(str);
outputStream.close();
socket.close();
}
}
执行结果分析:
- 此时服务端也启动,但是休眠4秒。当客户端连上服务端后,3秒内得不到响应则报错。
Exception in thread “main” java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at com.weidd.best.sockettest.ClientSocket.main(ClientSocket.java:28)