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
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)
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't connect to port "+i); }finally{ if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } }
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);
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.
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"); // 返回域名为'www.csdn.net'的ip地址 InetAddress.getByName("www.csdn.net");
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)
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); } }
• 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); } }
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("第三次连接成功"); } }
• 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);
Ändern Sie den Code
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);