SOCKET用法详解

在客户/服务器通信模式中,客户端需要主动创建与服务器的Socket(套接字),服务端收到了客户端的请求,也会创建与客户端连接的Socket。

Scoket可以看作两端通信的收发器,服务端和客户端都通过Scoket收发数据~~~

一:首先介绍Scoket的构造方法:

构造方法的重载:

Socket()

Socket(InetAddress address, int port) throws UnknowHostException, IOException

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

Socket(String host, int port) throws UnknowHostException, IOException

Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

1:解析:除了第一个不带参的构造方法,其余的构造方法都试图与服务器创建连接,如果连接成功,就返回Socket对象;如果因为某些原因连接失败,则会抛出异常。。。。。。

2:使用无参构造方法,设定等待建立连接的超时时间:

Socket socket = new Socket();
  SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);
  socket.connect(remoteAddr, 60000);  //等待建立连接的超时时间为1分钟

以上代码用于连接到本地机器上的监听8000端口的服务器程序, 等待连接的最长时间为1分钟. 如果在1分钟内连接成功则connet()方法顺利返回; 如果在1分钟内出现某种异常, 则抛出该异常; 如果超过1分钟后, 即没有连接成功, 也没有出现其他异常, 那么会抛出 SocketTimeoutException. Socket 类的 connect(SocketAddress endpoint, int timeout) 方法负责连接服务器, 参数endpoint 指定服务器的地址, 参数timeout 设定超时数据, 以毫秒为单位. 如果参数timeout 设为0, 表示永远不会超时, 默认是不会超时的.

3: 设定服务器的地址

除了第一个不带参数的构造方法, 其他构造方法都需要在参数中设定服务器的地址, 包括服务器的IP地址或主机名, 以及端口:

Socket(InetAddress address, int port)              //第一个参数address 表示主机的IP地址
  Socket(String host, int port)                              //第一个参数host 表示主机的名字

二. 获取Socket 的信息

在一个Socket 对象中同时包含了远程服务器的IP 地址和端口信息, 以及客户本地的IP 地址和端口信息. 此外, 从Socket 对象中还可以获得输出流和输入流, 分别用于向服务器发送数据, 以及接收从服务器端发来的数据. 以下方法用于获取Socket的有关信息.

getInetAddress(): 获得远程服务器的IP 地址.
getPort(): 获得远程服务器的端口.
getLocalAddress(): 获得客户本地的IP 地址.
getLocalPort(): 获得客户本地的端口.
getInputStream(): 获得输入流. 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownInput() 方法关闭输入流, 那么此方法会抛出IOException.
getOutputStream(): 获得输出流, 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownOutput() 方法关闭输出流, 那么此方法会抛出IOException.

三. 关闭Socket

当客户与服务器的通信结束, 应该及时关闭Socket , 以释放Socket 占用的包括端口在内的各种资源. Socket 的 close() 方法负责关闭Socket. 当一个Socket对象被关闭, 就不能再通过它的输入流和输出流进行I/O操作, 否则会导致IOException.

为了确保关闭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();
       }catch(IOException e){e.printStackTrace();}
   }

Socket 类提供了3 个状态测试方法.

isClosed(): 如果Socket已经连接到远程主机, 并且还没有关闭, 则返回true , 否则返回false .
isConnected(): 如果Socket曾经连接到远程主机, 则返回true , 否则返回false .
isBound(): 如果Socket已经与一个本地端口绑定, 则返回true , 否则返回false .

五. 设置Socket 的选项

Socket 有以下几个选项.

TCP_NODELAY: 表示立即发送数据.

SO_RESUSEADDR: 表示是否允许重用Socket 所绑定的本地地址.

SO_TIMEOUT: 表示接收数据时的等待超时数据.

SO_LINGER: 表示当执行Socket 的 close()方法时, 是否立即关闭底层的Socket.

SO_SNFBUF: 表示发送数据的缓冲区的大小.

SO_RCVBUF: 表示接收数据的缓冲区的大小.

SO_KEEPALIVE: 表示对于长时间处于空闲状态的Socket , 是否要自动把它关闭.

OOBINLINE: 表示是否支持发送一个字节的TCP 紧急数据.

时间: 06-26

SOCKET用法详解的相关文章

java Socket用法详解(转)

在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器, 服务器与客户端都通过 Socket 来收发数据. 这篇文章首先介绍Socket类的各个构造方法, 以及成员方法的用法, 接着介绍 Socket的一些选项的作用, 这些选项可控制客户建立与服务器的连接, 以及接收和发送数据的行为. 一. 构造Socket Socket的构造方法有以下几种重载形式:

java.net.Socket用法详解

一.Socket构造方法 Socket() Socket(InetAddress address, int port) throws UnknowHostException, IOException Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Socket(String host, int port) throws UnknowHostExceptio

第二章 Socket用法详解

2.1 构造Socket Socket构造方法如下: 1 Socket() 2 //Creates an unconnected socket, with the system-default type of SocketImpl. 3 4 Socket(InetAddress address, int port) 5 //Creates a stream socket and connects it to the specified port number at the 6 //specifi

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

Nmap用法详解

nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息.nmap支持很多扫描技术,例如:UDP.TCP connect().TCP SYN(半开扫描).ftp代理(bounce攻击).反向标志.ICMP.FIN.ACK扫描.圣诞树(Xmas Tree).SYN扫描和null扫描.从扫描类型一节可以得到细节.nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫

53 kvm及libvirt、使用virsh管理kvm虚拟机、网络虚拟化技术基础、网络名称空间netns用法详解

01 kvm及libvirt [[email protected] ~]# yum install libvirt libvirt-client python-virtinst virt-manager virt-install -y [[email protected] ~]# yum -y install qemu-kvm [[email protected] ~]# systemctl start libvirtd.service #创建桥 [[email protected] ~]# v

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

recv函数的用法详解

recv函数 int recv( SOCKET s,     char FAR *buf,      int len,     int flags     ); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. 该函数的第一个参数指定接收端套接字描述符: 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据: 第三个参数指明buf的长度: 第四个参数一般置0. 这 里只描述同步Socket的recv函数的执行流程.当应用程序调用recv函数时,recv先等

linux cp命令参数及用法详解---linux 复制文件命令cp

linux cp命令参数及用法详解---linux 复制文件命令cp [[email protected]Linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected]linux ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-