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);
Method 2:
Socket s=new Socket("127.0.0.1",8080); s.setSoTimeout(10000);
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"); }
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
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);
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的超时时间
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
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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.

Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is

Guide to TimeStamp to Date in Java. Here we also discuss the introduction and how to convert timestamp to date in java along with examples.

Capsules are three-dimensional geometric figures, composed of a cylinder and a hemisphere at both ends. The volume of the capsule can be calculated by adding the volume of the cylinder and the volume of the hemisphere at both ends. This tutorial will discuss how to calculate the volume of a given capsule in Java using different methods. Capsule volume formula The formula for capsule volume is as follows: Capsule volume = Cylindrical volume Volume Two hemisphere volume in, r: The radius of the hemisphere. h: The height of the cylinder (excluding the hemisphere). Example 1 enter Radius = 5 units Height = 10 units Output Volume = 1570.8 cubic units explain Calculate volume using formula: Volume = π × r2 × h (4

Java is a popular programming language that can be learned by both beginners and experienced developers. This tutorial starts with basic concepts and progresses through advanced topics. After installing the Java Development Kit, you can practice programming by creating a simple "Hello, World!" program. After you understand the code, use the command prompt to compile and run the program, and "Hello, World!" will be output on the console. Learning Java starts your programming journey, and as your mastery deepens, you can create more complex applications.
