Java Socket类的用法(附带实例)
在 Java 网络编程中,套接字是一个用于端点连接和数据交换的对象。一个套接字由 IP 地址和端口号唯一确定。网络的每一个端点,都可以通过和连接绑定的套接字对象来交换数据。
在 Client/Server 模式下,按照套接字在网络中所起的作用不同,可以将它们分为两类:客户机端套接字 Socket 和服务器端套接字 ServerSocket。
Socket 用于建立一个客户端与服务器端通信的连接。客户端要与服务器端通信,必须知道服务器的主机名和提供服务的端口号。当客户端发出建立连接请求,并且被服务器端接受时,客户端就会创建一个 Socket 对象。利用这个 Socket 对象,客户端可以和服务器端进行通信。
服务器端 Socket 和客户端 Socket 进行通信实现数据传送,需要以下四个步骤:
注意,每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。为此,系统特意为一些服务保留了一些端口。例如,http 服务的端口号为 80,ftp 服务的端口号为 23 等。0~1023 是系统预留的端口。所以在应用程序中设置自己的端口号时,最好选择一个大于 1023 的端口号。
下面通过一个案例来演示 Socket 类的使用。使用 Socket 类的方法,获取主机 IP 地址和主机名。
在 Client/Server 模式下,按照套接字在网络中所起的作用不同,可以将它们分为两类:客户机端套接字 Socket 和服务器端套接字 ServerSocket。
Socket 用于建立一个客户端与服务器端通信的连接。客户端要与服务器端通信,必须知道服务器的主机名和提供服务的端口号。当客户端发出建立连接请求,并且被服务器端接受时,客户端就会创建一个 Socket 对象。利用这个 Socket 对象,客户端可以和服务器端进行通信。
服务器端 Socket 和客户端 Socket 进行通信实现数据传送,需要以下四个步骤:
- 步骤 01:创建 Socket 对象。
- 步骤 02:打开连接到 Socket 对象的输入/输出流。
- 步骤 03:按照一定的协议对 Socket 对象进行读/写操作。
- 步骤 04:关闭 Socket 对象(即关闭 Socket 对象绑定的连接)。
注意,在调用 Socket 类和 ServerSocket 类的某些方法时,可能出现异常(如网络没有连通、指定的IP地址不可达、指定的端口号上没有服务进程,以及服务器还没有启动的情况下,客户端请求服务器处理信息等异常情况)。
Socket类的构造方法
Socket(InetAddress address, int port)构造方法用于创建一个主机地址为 address、端口号为 port 的流套接字。示例如下:
Socket mysocket = new Socket ("218.198.118.112", 2010);创建一个 Socket 对象连接远程主机,远程主机的 IP 地址是 218.198.118.112,端口号是 2010。
注意,每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。为此,系统特意为一些服务保留了一些端口。例如,http 服务的端口号为 80,ftp 服务的端口号为 23 等。0~1023 是系统预留的端口。所以在应用程序中设置自己的端口号时,最好选择一个大于 1023 的端口号。
Socket类的常用方法
方法名称 | 描述 |
---|---|
InetAddress getInetAddress() | 返回套接字连接的地址。 |
InetAddress getLocalAddress() | 获取套接字绑定的本地地址。 |
int getLocalPort() | 返回此套接字绑定到的本地端口。 |
SocketAddress getLocalSocketAddress() | 返回此套接字绑定的端点的地址,如果尚未绑定则返回null。 |
InputStream getInputStream() | 返回此套接字的输入流。 |
OutputStream getOutputStream() | 返回此套接字的输出流。 |
int getPort() | 返回此套接字连接的远程端口。 |
boolean isBound() | 返回套接字的绑定状态。 |
boolean isClosed() | 返回套接字的关闭状态。 |
boolean isConnected() | 返回套接字的连接状态。 |
void connect(SocketAddress endpoint, int timeout) | 将此套接字连接到服务器,并指定一个超时值。 |
void close() | 关闭此套接字。 |
下面通过一个案例来演示 Socket 类的使用。使用 Socket 类的方法,获取主机 IP 地址和主机名。
import java.net.Socket; public class SocketTest { public static void main(String args[]) { Socket socket; try { socket = new Socket("115.158.64.128", 80); System.out.println("是否绑定连接:" + socket.isBound()); System.out.println("本地端口:" + socket.getLocalPort()); System.out.println("连接服务器的端口:" + socket.getPort()); System.out.println("连接服务器的地址:" + socket.getInetAddress()); System.out.println("远程服务器的套接字:" + socket.getRemoteSocketAddress()); System.out.println("是否处于连接状态:" + socket.isConnected()); System.out.println("客户端连接详情:" + socket.toString()); } catch (Exception e) { System.out.println("服务器端没有启动"); } } }程序运行结果为:
是否绑定连接:true
本地端口:63371
连接服务器的端口:80
连接服务器的地址:/115.158.64.128
远程服务器的套接字:/115.158.64.128:80
是否处于连接状态:true
客户端连接详情:Socket[addr=/115.158.64.128,port=80,localport=63371]