本文章主要介绍Socket编程以及相关的ServerSocket类、Socket类、InetAddress类中的常用方法。
1. Socket编程的步骤
套接字使用TCP提供两台计算机之间的通信机制的基本思想是:服务器端创建一个套接字,客户端创建一个Socket对象并尝试连接服务器端的套接字,当连接建立时服务器端会创建一个Socket对象,从而客户端与服务器端之间的通信通过Socket对象进行写入和读取操作。在Java中java.net.ServerSocket类就代表一个套接字,并且java.net.ServerSocket类为服务器端提供了监听客户端连接并与客户端建立连接的机制。
两台计算机使用套接字建立TCP连接的具体步骤如下:
(1)服务器实例化一个ServerSocket对象,该对象需要描述服务器端的端口号,以供客户端的连接
(2)客户端创建一个Socket对象,用于连接指定服务器名称以及端口号的服务器端
(3)服务器端调用ServerSocket类的accept()方法,该方法用于侦听连接指定端口的服务器端的客户端
(4)如果客户端与服务器端建立连接成功,则服务器端和客户端均会返回一个Socket对象,此时二者即可进行通信
(5)服务器端与客户端之间的通信是通过使用I/O流,每个Socket对象都有输入输出流,客户端输出流连接到服务器端的输入流,客户端的输入流连接到服务器端的输出流,从而服务器端与客户端之间相互进行通信操作。
(6)关闭套接字(close()方法)
2. ServerSocket类的常用方法
服务器应用程序通过使用java.net.ServerSocket类获取一个端口,并具有侦听客户端连接请求的机制。
2.1 ServerSocket类的构造方法
(1)创建绑定到指定的本地端口号的服务器套接字
public ServerSocket(int port) throws IOException
(2)利用指定的backlog创建服务器端套接字并将其绑定到指定的本地端口号
public ServerSocket(int port, int backlog) throws IOException
关于backlog的说明:
服务器ServerSocket对象处理客户端Socket连接需要一定的时间,ServerSocket有一个队列存放还没有来得及处理的客户端的Socket对象,这个队列的容量就是backlog的含义。如果队列已经被客户端Socket对象占满,此时还有新的客户端的连接请求时,ServerSocket对象会拒绝新的连接请求,即backlog提供了客户端连接请求的容量限制功能,避免太多的客户端Socket占用太多服务器资源。
(3)创建绑定到指定的端口号、侦听backlog和本地IP地址的服务器套接字
public ServerSocket(int port, int backlog, InetAddress bindAddr)
(4)创建非绑定的服务器套接字
public ServerSocket() throws IOException
创建非绑定的服务器套接字时,如果ServerSocket构造方法没有抛出异常则表示该服务器套接字已成功的绑定到某个端口号并且侦听客户端请求。
2.2 ServerSocket类的实例方法
(1)返回此套接字绑定的侦听端口号
public int getLocalPort()
(2)侦听并接收到此套接字的连接
public Socket accept() throws IOException
(3)将ServerSocket绑定到特定的IP地址和端口号
public void bind(SocketAddress endpoint) throws IOException
3. Socket类的常用方法
java.net.Socket类代表客户端和服务器端都用来相互通信的套接字。客户端通过实例化连接指定的服务器端获取一个Socket对象,服务器端通过ServerSocket类的accept()方法侦听客户端的连接返回一个Socket对象。
3.1 Socket类的构造方法
(1)创建一个流套接字并将其连接到指定主机上的指定端口号
public Socket(String host, int port) throws UnknownHostException, IOException
(2)创建一个流套接字并将其连接到指定IP地址的指定端口号
public Socket(InetAddress address, int port) throws IOException
(3)创建一个流套接字并将其连接到指定远程主机上的指定远程端口
public Socket(String host, int port, InetAddress localAddr,int localPort) throws IOException
(4)创建一个流套接字并将其连接到指定远程地址上的指定远程端口
public Socket(InetAddress address, int port, InetAddress localAddr,int localPort) throws IOException
(5)通过系统默认类型的SocketImpl创建未连接套接字
public Socket()
说明:当Socket类的构造方法返回时,并不是简单地实例化一个Socket对象,而是尝试连接到指定的服务器和端口。
3.2 Socket类的实例方法
(1)将此套接字连接到服务器并指定一个超时值
public void connect(SocketAddress endpoint, int timeout) throws IOException
(2)返回套接字连接的地址
public InetAddress getInetAddress()
(3)返回此套接字连接到的远程端口
public int getPort()
(4)返回此套接字绑定到的本地端口
public int getLocalPort()
(5)返回此套接字连接的地址,若未连接则返回null
public SocketAddress getRemoteSocketAddress()
(6)获取此套接字的输入流
public InputStream getInputStream() throws IOException
(7)获取此套接字的输出流
public OutputStream getOutputStream() throws IOException
(8)关闭此套接字
public void close() throws IOException
4. InetAddress类的常用方法
java.net.InetAddress类表示互联网协议IP地址。
(1)根据提供的主机名和IP地址返回InetAddress对象
public static InetAddress getByAddress(String host, byte[] addr) throws UnknownHostException
(2)以字符串的形式返回IP地址
public String getHostAddress()
(3)获取此IP地址的主机名
public String getHostName()
(4)返回本地主机
public static InetAddress getLocalHost() throws UnknownHostException
(5)将IP地址转换为字符串
String toString()
以上就是在Socket编程过程中需要的三个基本的类以及它们的常用方法。