Heim > Java > javaLernprogramm > Hauptteil

Java-Netzwerkprogrammierung von flach bis tief 2 Detaillierte Einführung in die Konstruktion von Sockets und die damit verbundenen Ausnahmen bei der Verbindung mit dem Server

黄舟
Freigeben: 2017-03-04 10:07:33
Original
1660 Leute haben es durchsucht

Socket-Konstruktionsmethode und Socket-Einstellungen und Ausnahmen

In diesem Artikel werden die Socket-Konstruktionsmethode und Socket-bezogene Attributeinstellungen und Ausnahmebehandlung vorgestellt

  • Socket konstruieren

  • Wartezeitüberschreitung festlegen

  • Serveradresse festlegen

  • Clientadresse festlegen

  • Client verbindet sich mit Server. Mögliche Ausnahmen


Socket konstruieren

Die Konstruktionsmethode von Socket verfügt über die folgenden Überladungsmethoden:

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)
Nach dem Login kopieren

Mit Ausnahme des ersten Konstruktors versuchen alle anderen Konstruktoren, eine Verbindung mit dem Server herzustellen. Wenn die Verbindung erfolgreich ist, wird ein Socket-Objekt zurückgegeben. Wenn die Verbindung aus irgendeinem Grund fehlschlägt, wird eine IOException ausgelöst.
Der folgende Code scannt die Ports von 1 bis 1024 auf dem Host, um festzustellen, ob diese Ports vom Serverprogramm überwacht wurden.

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();
                    }
                }
            }
        }
    }
}
Nach dem Login kopieren

Legen Sie das Timeout für das Warten auf den Verbindungsaufbau fest

Verwenden Sie den Konstruktor ohne Parameter, um das Socket-Verbindungs-Timeout festzulegen:

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

Der obige Code gibt an, dass er zum Herstellen einer Verbindung zum 8000-Port verwendet wird, der auf diesem Computer überwacht wird. Die maximale Wartezeit auf die Verbindung beträgt 1 Minute. Wenn die Verbindung innerhalb einer Minute erfolgreich ist, kehrt die Methode connect() erfolgreich zurück. Wenn innerhalb einer Minute eine Ausnahme auftritt, wird eine Ausnahme ausgelöst. Wenn mehr als eine Minute vergangen ist, ist weder die Verbindung erfolgreich, noch wird eine Ausnahme ausgelöst. dann wird eine Ausnahme ausgelöst SocketTimeoutException. socket. connect(SocketAddress endpoint, int timeout); Der Parameter Endpoint ist für die Verbindung zum Server verantwortlich und gibt die Serveradresse an. Der Parameter Timeout legt den Timeout in Millisekunden fest. Wenn das Parameter-Timeout 0 ist, bedeutet dies, dass es nie zu einem Timeout kommt.

Legen Sie die Serveradresse fest

Unter den Socket-Konstruktionsmethoden müssen mit Ausnahme der ersten Konstruktionsmethode ohne Parameter andere Konstruktionsmethoden die Serveradresse angeben, einschließlich der des Servers IP- oder Hostname und Port:
Socket(InetAddress-Adresse, int-Port)
Socket(String-Host, int-Port)
Die InetAddress-Klasse stellt die IP-Adresse des Servers dar und bietet viele statische Methoden:

    // 返回本地主机的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");
Nach dem Login kopieren

Legen Sie die Adresse des Clients fest:

Standardmäßig stammt die IP-Adresse des Clients vom Host, auf dem sich das Clientprogramm befindet, und der Port des Clients ist zufällig vom Betriebssystem zugewiesen. Die Socket-Klasse stellt jedoch weiterhin einen Konstruktor bereit, mit dem Sie die IP und den Port des Clients explizit festlegen können:

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

Ausnahmen, die vom Client beim Herstellen einer Verbindung zum Server ausgelöst werden können

Wenn die Socket-Konstruktionsmethode eine Verbindung zum Server anfordert, kann die folgende Ausnahme ausgelöst werden:
• UnknownHostException: Wenn der Name oder die IP-Adresse des Hosts nicht erkannt werden kann, wird diese Ausnahme ausgelöst

• ConnectException: Wenn keine vorhanden ist, wird diese Ausnahme ausgelöst, wenn der Serverprozess auf dem angegebenen Port lauscht oder der Server die Verbindung ablehnt.

• SocketTimeoutException: Diese Ausnahme wird ausgelöst, wenn das Warten auf die Verbindung abläuft.

• BindException: Diese Ausnahme wird ausgelöst, wenn das Socket-Objekt nicht an die angegebene lokale IP-Adresse oder den angegebenen Port gebunden werden kann.

Nehmen Sie die folgende Testklasse als Beispiel, um den Grund für das Auslösen einer Ausnahme zu veranschaulichen.

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);
    }
}
Nach dem Login kopieren

• UnknownHostException auslösen:
Diese Ausnahme wird ausgelöst, wenn der Name oder die IP-Adresse des Hosts nicht erkannt werden kann. Beispiel: Host ist: „somehost11“. Die connect-Methode des Sockets löst eine UnknownHostException aus.
• Situationen, in denen ConnectException geworfen wird:
ConnectException wird in den folgenden zwei Situationen geworfen.
1) Es gibt keinen Serverprozess, der den angegebenen Port überwacht. Beispiel: Host ist „localhost“ und Port ist 12321. Wenn der lokale Port 12321 von keinem Prozess überwacht wird, löst die Socket-Verbindungsmethode eine ConnectException aus.
2) Der Serverprozess hat die Verbindung abgelehnt. Führt die Situation ein, in der der Serverprozess die Verbindungsanforderung des Clients ablehnt. Wie im folgenden Beispielcode gezeigt, stellt der zweite Parameter in der Konstruktionsmethode eines einfachen Dienstprogramms ServerSocket die Länge der Anforderungswarteschlange dar. Wenn die Warteschlange voll mit Anfragen ist, lehnt der Server die verbleibenden Anfragen ab. Auslösen einer ConnectException

public class SimplServer {    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888, 2);
        Thread.sleep(3600000);
    }
}
Nach dem Login kopieren
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("第三次连接成功");
    }
}
Nach dem Login kopieren

• Situationen, in denen eine SocketTimeoutException ausgelöst wird
Diese Ausnahme wird ausgelöst, wenn bei der Clientverbindung eine Zeitüberschreitung auftritt. Änderung                                                                                                                                                                    Von den ursprünglichen 1000 Millisekunden auf 1 Millisekunde geändert, was die Möglichkeit einer Zeitüberschreitung erhöht. socket.connect(remoteAddress, 1);

• Situation, in der BindException ausgelöst wird:

Ändern Sie den Code

socket = new Socket();socket.connect(remoteAddress, 1000);
Nach dem Login kopieren
wie folgt:

socket = new Socket();
socket.bind(new InetSocketAddress(InetAddress.getByName("222.34.5.6"), 5678));
socket.connect(remoteAddress, 1000);
Nach dem Login kopieren
Der geänderte Code versucht, die lokale IP-Adresse zu ändern des Sockets Stellen Sie ihn auf 222.34.5.6 und den lokalen Port auf 5678 ein. Wenn dieser Computer nicht über die IP verfügt oder der Port belegt ist, tritt eine BindException auf.

Das Obige ist eine detaillierte Einführung in die Java-Netzwerkprogrammierung von flach bis tief, Socket-Konstruktion und damit verbundene Ausnahmen für die Verbindung zum Server. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn). )!



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage