0
点赞
收藏
分享

微信扫一扫

构造Socket


1:Socket的构造函数

​​Socket​​()

​​Socket​​(​​InetAddress​​ address, int port)

​​Socket​​(​​InetAddress​​ address, int port, ​​InetAddress​​ localAddr, int localPort) 
           创建一个套接字并将其连接到指定远程端口上的指定远程地址。

​​Socket​​(​​Proxy​​ proxy) 
          根据不管其他设置如何都应使用的指定代理类型(如果有),创建一个未连接的套接字

​​Socket​​(​​SocketImpl​​ impl)
          创建带有用户指定的 SocketImpl 的未连接 Socket。

​​Socket​​(​​String​​ host, int port)
          创建一个流套接字并将其连接到指定主机上的指定端口号。

​​Socket​​(​​String​​ host, int port, ​​InetAddress​​ localAddr, int localPort)
          创建一个套接字并将其连接到指定远程主机上的指定远程端口。

 

2:类portScanner

import java.io.IOException;
import java.net.Socket;

public class PortScanner {
 
 public static void main(String[] args) {
  String local = "localhost";
  if(args.length > 0) {
   local = args[0];
  }
  new PortScanner().scan(local);
 }
 
 public void scan(String host) {
  Socket socket = null;
  for(int port = 0; port < 1024; port++) {
   try {
    socket = new Socket(host, port);
    System.out.println("There is a server on port" + port);
    
   } catch(IOException e) {
    System.out.println("cannot connect to port" + port);
   } finally {
    try {
     if(socket != null) {
      socket.close();
     }
    } catch(IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
}
PortScanner类能够扫描主机上的从1到1024之间的端口,判断这些端口是否已经被服务器程序监听。

3:类 InetSocketAddress

此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。

InetSocketAddress(InetAddress​

          根据 IP 地址和端口号创建套接字地址。

InetSocketAddress(int port)​

          创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。

InetSocketAddress(String​

          根据主机名和端口号创建套接字地址。

 

4:类ConnectTester

package lee;

import java.io.IOException;
import java.net.BindException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

public class ConnectTester {

 public static void main(String[] args) {
  //String host = "​​​www.javathinker.org​​​";
  String host = "​​​www.baidu.com​​​";
  int port = 80;
//  if(args.length > 0) {
//   host = args[0];
//   port = Integer.parseInt(args[1]);
//  }
  new ConnectTester().connect(host, port);
 }
 
 public void connect(String host, int port) {
  SocketAddress socketAddress = new InetSocketAddress(host, port);
  Socket socket = null;
  String result = "";
  
  try {
   long begin = System.currentTimeMillis();
   socket = new Socket();
   socket.connect(socketAddress, 2000);   //超时时间为2秒钟
   long end = System.currentTimeMillis();
   result = (end - begin) + "ms";
  } catch(BindException e) {
   result = "Local address and port can't be binded";
  } catch(UnknownHostException e) {
   result = "Unknown host";
  } catch(ConnectException e) {
   result = "Connection refused";
  } catch(SocketTimeoutException e) {
   result = "Time out";
  } catch (IOException e) {
   result = "failure";
  } finally {
   try {
    if(socket != null) {
     socket.close();
    }
   } catch(IOException e) {
    e.printStackTrace();
   }
  }
  System.out.println(socketAddress + ":" + result);
 }
}

 

当Socket构造方法连接服务器时,可能会抛出下面异常:

 *UnknownHostException :如果无法识别主机的名字或者ip地址,会抛出此异常

 * BindException : 如果无法把Socket对象和指定的本地IP地址或者端口绑定,就会抛出此异常

 * ConnectException :如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,会抛出此异常
 * SocketTimeoutException : 如果等待连接超时,就会抛出此异常

 

举报

相关推荐

0 条评论