>  기사  >  Java  >  얕은 것에서 깊은 것까지 Java 네트워크 프로그래밍 2 소켓 구성 및 서버에 연결하는 관련 예외에 대한 자세한 소개

얕은 것에서 깊은 것까지 Java 네트워크 프로그래밍 2 소켓 구성 및 서버에 연결하는 관련 예외에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-04 10:07:331644검색

소켓 구성 방법과 소켓 설정 및 예외

이 글에서는 소켓 구성 방법과 소켓 관련 속성 설정 및 예외 처리에 대해 소개합니다

  • 소켓 구성

  • 대기 시간 제한 설정

  • 서버 주소 설정

  • 클라이언트 주소 설정

  • 클라이언트가 서버에 연결 가능한 예외


소켓 구성

소켓 구성 방법에는 다음과 같은 오버로딩 방법이 있습니다.

Socket();Socket(InetAddress address, int port)Socket(InetAddress address, int port, 
InetAddress localAddr, int localPort)Socket(Proxy proxy)Socket(SocketImpl impl)Socket(String host, int port)
Socket(String host, int port, InetAddress localAddr, int localPort)

제외 첫 번째 생성자의 경우 다른 모든 생성자는 서버와의 연결을 시도합니다. 연결이 성공하면 어떤 이유로 연결이 실패하면 IOException이 발생합니다.
다음 코드는 호스트의 포트 1부터 1024까지 스캔하여 해당 포트가 서버 프로그램에 의해 모니터링되는지 확인합니다.

public class PortScanner {    public static void main(String[] args) {
        String host = "localhost";        new PortScanner().scan(host);
    }    public void scan(String host){
        Socket socket = null;        for(int i=0;i<1024;i++){            try {
                socket = new Socket(host, i);
                System.out.println("There is a server on port "+i);
            }  catch (IOException e) {
                System.out.println("Can&#39;t connect to port "+i);
            }finally{                if(socket!=null){                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

연결 설정 대기 시간 초과 설정

소켓 연결 시간 초과를 설정하려면 매개변수 없이 생성자를 사용하세요.

Socket socket = new Socket();
SocketAddress endPoint = new InetSocketAddress("localhost", 8000);socket.connect(endPoint, 60000);

위 코드는 다음을 나타냅니다. 이 시스템에서 모니터링되는 포트 8000에 연결하는 데 사용됩니다. 연결을 기다리는 최대 시간은 1분입니다. 1분 이내에 연결이 성공하면 connect() 메서드는 성공적으로 반환하고, 1분 이내에 예외가 발생하면 예외가 발생하며, 연결이 성공하지도 않고 예외도 발생하지 않습니다. 그러면 예외가 발생합니다 SocketTimeoutException. socket. connect(SocketAddress endpoint, int timeout); 서버 연결을 담당하는 엔드포인트 매개변수는 서버 주소를 지정하고, 매개변수 timeout은 시간 제한을 밀리초 단위로 설정합니다. 매개변수 시간 초과가 0이면 시간 초과가 발생하지 않는다는 의미입니다.

서버 주소 설정

소켓 구성 방법 중 매개 변수가 없는 첫 번째 구성 방법을 제외한 다른 구성 방법에는 서버 주소를 포함하여 서버 주소를 지정해야 합니다. IP 또는 호스트 이름 및 포트:
Socket(InetAddress address, int port)
Socket(String Host, int port)
InetAddress 클래스는 서버의 IP 주소를 나타냅니다.

    // 返回本地主机的IP地址
    InetAddress.getLocalHost();    // 返回代表10.202.164.65的IP地址
    InetAddress.getByName("10.202.164.65");    // 返回域名为&#39;www.csdn.net&#39;的ip地址
    InetAddress.getByName("www.csdn.net");

클라이언트 주소 설정:

기본적으로 클라이언트의 IP 주소는 클라이언트 프로그램이 위치한 호스트에서 오고, 클라이언트의 포트는 무작위로 할당됩니다. 운영 체제. 그러나 Socket 클래스는 여전히 클라이언트의 IP와 포트를 명시적으로 설정할 수 있는 생성 방법을 제공합니다.

//参数localAddr和localPort用来设置客户端的IP和端口。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
Socket(String host, int port, InetAddress localAddr, int localPort)

서버에 연결할 때 클라이언트에서 발생할 수 있는 예외

소켓이 생성될 때 메소드가 서버에 연결을 요청하면 다음과 같은 예외가 발생할 수 있습니다.
• UnknownHostException: 호스트의 이름이나 IP 주소를 인식할 수 없는 경우 이 예외가 발생합니다.

• ConnectException: 서버 프로세스가 없는 경우 지정된 포트를 수신하거나 서버가 연결을 거부하는 경우 이 예외가 발생합니다.

• SocketTimeoutException: 연결 대기 시간이 초과되면 이 예외가 발생합니다.

• BindException: 소켓 개체를 지정된 로컬 IP 주소 또는 포트에 바인딩할 수 없는 경우 이 예외가 발생합니다.

다음 테스트 클래스를 예로 들어 예외가 발생하는 이유를 보여줍니다.

public class ConnectTester {    public static void main(String[] args) {
        String host = "www.csdn.net";        
        int port = 12312;        
        new ConnectTester().connect(host, port);
    }    public void connect(String host,int port){
        SocketAddress remoteAddress = new InetSocketAddress(host, port);
        Socket socket = null;
        String result = null;        
        try{
            socket = new Socket();            
            long start = System.currentTimeMillis();
            socket.connect(remoteAddress,1000);            
            long end = System.currentTimeMillis();
            result = (end-start)+"ms";
        }catch(BindException bindException){
            result = "BindException,Socket对象与指定的本地IP地址或端口绑定,异常";
        }catch (UnknownHostException unknownHostException) {
            result = "UnknownHostException,无法识别的主机";
        }catch (ConnectException connectException) {
            result = "ConnectException,连接被拒绝";
        }catch (SocketTimeoutException socketTimeoutException) {
            result = "SocketTimeoutException,连接超时";
        }catch(IOException e){
            result = "IOException,连接失败";
        }finally{            if(socket!=null){                
        try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(remoteAddress+" : "+result);
    }
}

• UnknownHostException 발생:
이 예외는 호스트의 이름이나 IP 주소를 인식할 수 없는 경우 발생합니다. 예: 호스트는 'somehost11'입니다. 소켓의 연결 메소드는 UnknownHostException을 발생시킵니다.
• ConnectException이 발생하는 상황:
ConnectException은 다음 두 가지 상황에서 발생합니다.
1) 지정된 포트를 수신하는 서버 프로세스가 없습니다. 예를 들어 호스트는 'localhost'이고 포트는 12321입니다. 로컬 포트 ​​12321이 어떤 프로세스에서도 모니터링되지 않는 경우 소켓 연결 메서드는 ConnectException을 발생시킵니다.
2) 서버 프로세스가 연결을 거부했습니다. 서버 프로세스가 클라이언트의 연결 요청을 거부하는 상황을 소개합니다. 다음 샘플 코드에서 볼 수 있듯이 간단한 서비스 프로그램인 ServerSocket의 생성 메소드에서 두 번째 매개변수는 요청 큐의 길이를 나타냅니다. 대기열이 요청으로 가득 차면 서버는 나머지 요청을 거부합니다. ConnectException 발생

public class SimplServer {    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888, 2);
        Thread.sleep(3600000);
    }
}
public class SimpleClient {    
public static void main(String[] args) throws Exception{
        String host = "localhost";        int port = 8888;
        Socket s1 = new Socket(host, port);
        System.out.println("第一次连接成功");
        Socket s2 = new Socket(host, port);
        System.out.println("第二次连接成功");
        Socket s3 = new Socket(host, port);
        System.out.println("第三次连接成功");
    }
}

• SocketTimeoutException이 발생하는 상황
이 예외는 클라이언트 연결 시간이 초과되면 발생합니다. 수정                                                                                                                                                      원래 1000밀리초에서 1밀리초로 수정되어 시간 초과 가능성이 높아졌습니다. socket.connect(remoteAddress, 1);

• BindException이 발생하는 상황:

코드

socket = new Socket();socket.connect(remoteAddress, 1000);

를 다음으로 수정:

socket = new Socket();
socket.bind(new InetSocketAddress(InetAddress.getByName("222.34.5.6"), 5678));
socket.connect(remoteAddress, 1000);

수정된 코드는 소켓의 로컬 IP 주소를 다음으로 설정하려고 시도합니다. 222.34.5.6의 경우 로컬 포트를 5678로 설정하세요. 이 머신에 IP가 없거나 포트가 점유된 경우 BindException이 발생합니다.

위 내용은 Java 네트워크 프로그래밍의 간단한 내용부터 고급 내용까지, 소켓 구성 및 서버에 연결하는 관련 예외에 대한 자세한 소개입니다. 더 많은 관련 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요. )!



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.