Socket详解

来源:互联网 发布:bgp only 网络互联 编辑:程序博客网 时间:2024/05/16 19:25

Socket详解

 

Socket()
          
通过系统默认类型的 SocketImpl 创建未连接套接字

 

Socket(InetAddress address, int port)
          
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

 

Socket(InetAddress host, int port, boolean stream)
          
已过时。 Use DatagramSocket instead for UDP transport.

 

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

 

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

protected

Socket(SocketImpl impl)
          
使用用户指定的 SocketImpl 创建一个未连接 Socket

 

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

 

Socket(String host, int port, boolean stream)
          
已过时。 使用 DatagramSocket 取代 UDP 传输。

 

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

   . accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
  . getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。

  . getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

  注重:其中getInputStreamgetOutputStream方法均会产生一个IOException,它必须被捕捉,因为它们返回的流对象,通常都会被另一个流对象使用。

1.       设定等待建立连接的超时时间

客户端请求与服务端的Socket连接时,默认是一直等待下去,直到连接成功或者抛出异常。

以下代码用于连接本地的监听8000端口的服务端,并且设定了等待连接的超时时间,如果在1分钟内出现某种异常,则抛出该异常,如果超过了一分钟,没连接成功,也没出现任何异常,则抛出SocketTimoutException,如果在1分钟内顺利连接,则connect() 方法顺利返回

 

Socket socket = new Socket();

SocketAddress remoteAddr = new InetSocketAddress(“localhost”,8000);

Socket.connect(remoteAddr,6000);

 

4.客户端连接服务端可能抛出的异常

UnkonwnHostException:如果无法识别主机的名字或IP地址

ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接

SocketTimeoutException:如果等待连接超时

BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定

5.获取Socket的信息

在一个socket对象中包含了远程服务器的IP地址和端口信息,以及客户本地的IP地址和端口信息。从socket对象中还可以获得输出流和输入流,分别用于向服务器发送数据,以及接收从服务器发来的数据。

getInetAdress(); 获得远程服务器IP地址

getPort();获得远程服务器的端口

getLocalAddress();获得客户本地的IP地址

getLocalPort();获得客户本地的端口

getInputStream();获得输入流,会抛出IOException

getOutputStream();获得输入流,会抛出IOException

6.关闭Socket

为确保关闭Socket的操作总是被执行,建议把它写到finally代码块中

Socket socket=null;

Try{

Socket=new Socket(www.javathinker.org,80);

//执行接收和发送数据的操作

……

}catch(IOException e)

e.printStackTrace();

}finally{

  Try{

If(socket!=null)socket.close();[番茄花园1] 

}catch(IOException e){ e.printStackTrace();

}

}

判断一个socket对象是否处于连接状态:

Boolean isConnected=socket.isConnected()&&!socket.isClosed();

原创粉丝点击