>  기사  >  Java  >  Java에서 소켓에 대한 시간 초과 설정

Java에서 소켓에 대한 시간 초과 설정

尚
앞으로
2019-11-28 17:17:055235검색

Java에서 소켓에 대한 시간 초과 설정

Java에서 소켓의 시간 초과를 설정하는 두 가지 주요 방법이 있습니다. 살펴보겠습니다. (권장: java 비디오 튜토리얼)

방법 1:

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

방법 2:

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

그래서 이 두 가지는 무엇입니까? 메소드에 의해 설정된 타임아웃 기간은 무엇을 의미합니까? 차이점은 무엇입니까?

첫 번째 방법

먼저 첫 번째 방법을 살펴보고 테스트해 보겠습니다.

기본 방법에서 소켓을 만들고

ip: 29.212.19.201, 포트: 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");
  }

에 연결합니다. 이 코드를 실행하면 10초 전에는 콘솔에 어떤 정보도 출력되지 않았으며, 10초 후에는 다음과 같은 정보가 출력되었습니다.

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

29.212.19.201:2132에 ​​접속을 시도했을 때 접속이 되지 않은 것을 알 수 있습니다. 10초 동안 연결되었으므로 java.net.SocketTimeoutException: 연결 시간 초과 예외가 보고되었습니다.

위 IP는 알 수 없는 IP입니다. 즉, 현재 네트워크 환경에서는 내 IP가 이 IP에 접근할 수 없기 때문에 우리 소켓은 타임아웃될 때까지 이 IP에 계속 연결을 시도한다고 설명하세요. IP가 로컬 127.0.0.1과 알 수 없는 포트 등 알려진 IP인 경우 이 소켓 연결은 즉시 오류를 보고합니다.

또한 연결 시간 초과가 설정되지 않은 경우 소켓 기본 연결 시간 초과는 약 21초입니다(3회 테스트, 모두 21020밀리초). 다음은 연결 시간 초과를 설정하지 않은 코드입니다.

Socket socket = new Socket("29.212.19.201", 2132);

두 번째 방법

그런 다음 두 번째 방법을 살펴보겠습니다. 이번에는 이 시나리오를 시뮬레이션하기 위해 로컬에서 소켓 서비스 및 클라이언트 세트를 작성해야 합니다. .

클라이언트가 setSoTimeout을 10초로 설정하도록 했습니다. 서버 코드가 클라이언트 요청 정보를 얻은 후 클라이언트 요청을 처리하고 응답을 반환하기 전에 10초 동안 대기합니다.

효과를 살펴보겠습니다.

//服务端
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的超时时间

실행 후 클라이언트 출력을 기다립니다. 10초 후 클라이언트 콘솔 출력 정보는 다음과 같습니다.

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

10초 후 클라이언트가 보고합니다. 오류 java.net.SocketTimeoutException: Read timed out 클라이언트 콘솔 정보의 정상적인 출력을 확인하십시오. 클라이언트가 시간 초과를 보고하더라도 서버는 계속 다운되지만 클라이언트가 자신에게 보낸 메시지를 수신하지 못합니다. 10초 후에 서버에 접속하세요.

또한 테스트 결과 클라이언트가 setSoTimeout을 설정하지 않은 경우 서버가 500초와 같이 오랜 시간 동안 절전 모드로 유지되는 것으로 나타났습니다.

차이와 의미

둘의 의미와 차이점에 대해 이야기해보겠습니다.

방법 1은 클라이언트와 서버 간 연결의 시간 초과 시간입니다. 즉, 10초 이내에 연결을 설정할 수 없는 경우 java.net.SocketTimeoutException: 연결 시간 초과 연결 시간 초과 예외가 보고됩니다. 이때 클라이언트로부터 메시지를 받는 서버는 물론 두 사람 모두 연결이 설정되지 않았습니다.

방법 2는 inputStream.read() 메소드의 차단 시간을 설정하는 것입니다. 이는 클라이언트가 요청을 보낸 후 서버가 응답을 반환할 때까지 기다리는 시간입니다. 이 시간을 초과하면 java.net이 발생합니다. .SocketTimeoutException: 읽기 시간 초과 예외. 이때 두 사람은 정상적으로 연결을 맺게 되고, 서버는 클라이언트의 요청을 받게 된다.

타임아웃을 제어하는 ​​두 가지 방법은 전화를 거는 것과 마찬가지로 초점이 다릅니다. 방법 1은 10초 동안 전화를 받지 않으면 전화를 끊는 것입니다. 방법 2는 전화가 온 후 10초를 기다리는 것입니다. 10초 후에는 아무 말도 하지 않아도 전화가 연결됩니다.

더 많은 Java 지식을 알고 싶다면 java 기본 튜토리얼 칼럼을 주목해주세요.

위 내용은 Java에서 소켓에 대한 시간 초과 설정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제