Home > Java > javaTutorial > body text

Java network programming from shallow to deep 2 Detailed introduction to the construction of Socket and related exceptions connecting to the server

黄舟
Release: 2017-03-04 10:07:33
Original
1661 people have browsed it

Socket construction method and Socket settings and exceptions

This article will introduce the Socket construction method and Socket related attribute settings and exception handling

  • Construct Socket

  • Set the waiting timeout

  • Set server address

  • Set client address

  • Client connects to server Possible exceptions


##Constructing Socket

The construction method of Socket has the following overloading methods:

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)
Copy after login

Except for the first constructor, all other constructors will try to establish a connection with the server. If the connection is successful, a Socket object will be returned; if the connection fails for some reason, an IOException will be thrown.

The following code scans the ports from 1 to 1024 on the host to determine whether these ports have been monitored by the server program.

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();
                    }
                }
            }
        }
    }
}
Copy after login

Set the timeout for waiting to establish a connection

Use the constructor without parameters to set the socket connection timeout:

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

The above code represents Used to connect to port 8000 that is monitored on this machine. The maximum time to wait for a connection is 1 minute. If the connection is successful within 1 minute, the connect() method returns successfully; if an exception occurs within 1 minute, an exception will be thrown; if more than 1 minute has passed, neither the connection is successful nor an exception is thrown, then an exception will be thrown

SocketTimeoutException. socket.connect(SocketAddress endpoint, int timeout);Responsible for connecting to the server, the parameter endpoint specifies the server address, and the parameter timeout sets the timeout in milliseconds. If the parameter timeout is 0, it means it will never time out.

Set the server address

Among the Socket construction methods, except for the first construction method without parameters, other construction methods need to specify the server address, including the server's IP or host name, and port:

Socket(InetAddress address, int port)
Socket(String host, int port)
The InetAddress class represents the IP address of the server. InetAddress provides many static methods:

    // 返回本地主机的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");
Copy after login

Set the client's address:

By default, the client's IP address comes from the host where the client program is located, and the client's port is randomly assigned by the operating system. However, the Socket class still provides a construction method that allows you to explicitly set the client's IP and port:

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

Exceptions that may be thrown by the client when connecting to the server

When Socket is constructed When the method requests to connect to the server, the following exception may be thrown:

• UnknownHostException: If the name or IP address of the host cannot be recognized, this exception will be thrown

• ConnectException: If there is no server process This exception will be thrown if the specified port is listened to or the server refuses the connection.

• SocketTimeoutException: This exception will be thrown if the wait for the connection times out.

• BindException: This exception will be thrown if the Socket object cannot be bound to the specified local IP address or port.

Take the following test class as an example to demonstrate the reason for throwing an exception.

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);
    }
}
Copy after login

• Throwing UnknownHostException:

If the name or IP address of the host cannot be recognized, this exception will be thrown. For example: host is: 'somehost11'. The Socket's connect method will throw an UnknownHostException.
• Situations in which ConnectException is thrown:
ConnectException will be thrown in the following two situations.
1) There is no server process listening on the specified port. For example: host is ‘localhost’ and port is 12321. If the local port 12321 is not monitored by any process, the Socket connection method will throw ConnectException.
2) The server process refused the connection. Introduces the situation when the server process rejects the client's connection request. As shown in the following sample code, the second parameter in the construction method of a simple service program ServerSocket represents the length of the request queue. If the queue is full of requests, the server rejects the remaining requests. Throwing ConnectException

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

• Throwing SocketTimeoutException

If the client connection times out, this exception will be thrown. Modification ​ ​
socket.connect(remoteAddress, 1);Modified from the original 1000 milliseconds to 1 millisecond, which increases the possibility of timeout.

• Situation in which BindException is thrown:

Modify the code

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

to:

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

The modified code attempts to set the local IP address of the Socket to 222.34. 5.6, set the local port to 5678. If this machine does not have the IP or the port is occupied, a BindException will occur.

The above is a detailed introduction to Java network programming from shallow to deep, Socket construction and related exceptions connecting to the server. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!



Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template