首页 > 编程笔记 > Java笔记 阅读:1

Java Socket类的用法(附带实例)

在 Java 网络编程中,套接字是一个用于端点连接和数据交换的对象。一个套接字由 IP 地址和端口号唯一确定。网络的每一个端点,都可以通过和连接绑定的套接字对象来交换数据。

在 Client/Server 模式下,按照套接字在网络中所起的作用不同,可以将它们分为两类:客户机端套接字 Socket 和服务器端套接字 ServerSocket。

Socket 用于建立一个客户端与服务器端通信的连接。客户端要与服务器端通信,必须知道服务器的主机名和提供服务的端口号。当客户端发出建立连接请求,并且被服务器端接受时,客户端就会创建一个 Socket 对象。利用这个 Socket 对象,客户端可以和服务器端进行通信。

服务器端 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]

注意,程序中指定的 IP 地址和端口号必须是已经启动的计算机的 IP 地址和端口号。如果指定的计算机没有启动或设置了防火墙,系统将报异常。另外,因为客户端在连接服务器时是随机使用本地端口,所以每次运行本地端口的值可能会不同。

相关文章