Home > Java > JavaBase > body text

Set timeout for Socket in Java

Release: 2019-11-28 17:17:05
forward
5254 people have browsed it

Set timeout for Socket in Java

There are two main ways to set the timeout for Socket in Java. Let’s take a look: (Recommended: java video tutorial)

Method 1:

Socket s=new Socket(); 
s.connect(new InetSocketAddress(host,port),10000);
Copy after login

Method 2:

Socket s=new Socket("127.0.0.1",8080);
s.setSoTimeout(10000);
Copy after login

So what do the timeouts set in these two methods mean? what differences are there?

The first way

Let’s take a look at the first way first, let’s test it:

In the main method we create the Socket Connect to

ip: 29.212.19.201, port: 2132

public static void main(String[] args) {
    Socket socket = new Socket();
    SocketAddress endpoint = new InetSocketAddress("29.212.19.201", 2132);
    long timeMillis = System.currentTimeMillis();
    try {
      socket.connect(endpoint, 10000);
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.out.println(System.currentTimeMillis()-timeMillis);
    System.out.println("end");
  }
Copy after login

Run this code, the console does not output any information before 10 seconds, and prints the following information after 10 seconds:

10002
java.net.SocketTimeoutException: connect timed out
  at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
  at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
  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.PlainSocketImpl.connect(PlainSocketImpl.java:172)
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
  at java.net.Socket.connect(Socket.java:589)
  at com.wakling.cn.SocketSever.main(SocketSever.java:33)
end
Copy after login

It can be seen that when we tried to connect to 29.212.19.201:2132, the connection failed to connect for 10 seconds, so a java.net.SocketTimeoutException: connect timed out exception was reported.

Explain that the above IP is an unknown IP, that is, my IP cannot access this IP in the current network environment, so our Socket will keep trying to connect to this IP until it times out. If the IP is a known IP, such as local 127.0.0.1 plus an unknown port, then this Socket connection will immediately report an error.

In addition, if the connection timeout is not set, the Socket default connection timeout is about 21s (tested three times, all 21020 milliseconds). The following is the code that does not set the connection timeout:

Socket socket = new Socket("29.212.19.201", 2132);
Copy after login

The second method

Then let’s take a look at the second method. At this time we need to Write a set of Socket services and clients to simulate this scenario.

We let the client set setSoTimeout to 10s. After the server code gets the client request information, it sleeps for 10s before processing the client request and returning a response.

Let’s take a look at the effect. The key code is as follows:

//服务端
System.out.println("进入休眠,10s后醒来");
Thread.sleep(10000);
System.out.println("休眠结束");
//返回响应
OutputStream outputStream = socket.getOutputStream();// 获取一个输出流,向服务端发送信息
PrintWriter printWriter = new PrintWriter(outputStream);// 将输出流包装成打印流
printWriter.print("你好,服务端已接收到您的信息");
printWriter.flush();

//客户端
Socket socket = new Socket("127.0.0.1",2132);
socket.setSoTimeout(10000);//read的超时时间
Copy after login

After running, wait for the client output. After 10s, the client console outputs the following information:

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 sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
  at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
  at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  at java.io.InputStreamReader.read(InputStreamReader.java:184)
  at java.io.BufferedReader.fill(BufferedReader.java:161)
  at java.io.BufferedReader.readLine(BufferedReader.java:324)
  at java.io.BufferedReader.readLine(BufferedReader.java:389)
  at com.wakling.cn.SocketClient.main(SocketClient.java:36)
10020
end
Copy after login

10s here Afterwards, the client reported an error java.net.SocketTimeoutException: Read timed out. Check the client console information for normal output. Even if the client has reported a timeout, the server continues to go down, but the client has not received the message sent by the server after 10 seconds. own news.

In addition, tests have found that the server sleeps for a long time, such as 500s. When the client does not set setSoTimeout, the default timeout is 120s.

Difference and significance

Let’s talk about the meaning and difference between the two.

Method 1 is the timeout time for the connection between the client and the server, that is, if the connection cannot be established within 10 seconds, a java.net.SocketTimeoutException: connect timed out connection timeout exception will be reported. At this time, the two have not established a connection, let alone the server receiving messages from the client.

Method 2 is to set the blocking time of the inputStream.read() method, that is, the waiting time for the client to wait for the server to return a response after sending a request. Exceeding this time will cause java.net.SocketTimeoutException: Read timed out abnormal. At this time, the two establish a connection normally, and the server receives the client's request.

The two methods of controlling timeout have different focuses. Just like making a phone call, method 1 is to make a call for 10 seconds and I will hang up if you don’t answer the call. Method 2 is to wait for you for 10 seconds after the call is connected. If you don't speak for a few seconds, you'll hang up. After 10 seconds, you won't listen even if you don't speak.

For more java knowledge, please pay attention to the java basic tutorial column.

The above is the detailed content of Set timeout for Socket in Java. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template