Java 中的套接字编程

2025年9月2日 | 阅读 6 分钟

Java 中的套接字编程允许 客户端服务器 之间进行网络通信。通过套接字作为通信的终结点,它可以发送和接收数据。客户端和服务器必须知道彼此的 IP 地址和一个特定的端口号才能建立连接。

Java 套接字编程步骤

使用套接字通过 TCP 在两台计算机之间建立连接时,会发生以下步骤:

  • 服务器实例化一个 ServerSocket 对象,以指定通信应该在哪一个端口号上进行。
  • 服务器调用 ServerSocket 类的 accept() 方法。此方法将一直等待,直到客户端连接到服务器指定的端口。
  • 服务器一直在等待,此时客户端会实例化一个 Socket 对象,并指定服务器名称和端口号以进行连接。
  • Socket 类的构造函数会尝试建立客户端与指定服务器和端口之间的连接。如果通信建立成功,客户端现在将拥有一个可以与服务器通信的 Socket 对象。
  • 服务器端的 accept() 方法将返回一个与客户端套接字关联的新服务器套接字引用。

一旦建立连接,就可以使用 I/O 流进行通信。每个套接字都有一个输入流和一个输出流。客户端的输出流连接到服务器的输入流,客户端的输入流连接到服务器的输出流。由于 TCP 是双向通信协议,因此数据可以同时通过两个流进行发送。

Socket Programming in Java

客户端编程

1. 建立连接

客户端应用程序必须首先创建一个套接字才能连接到服务器。Java 中的套接字使用 Java.net.Socket 类。客户端必须提供服务器的 IP 地址以及服务器正在监听连接的端口号。

语法

  • 第一个参数 (“127.0.0.1”): 这是服务器的 IP 地址。例如,“127.0.0.1”是本地主机地址,当客户端和服务器在同一台机器上运行时使用。
  • 第二个参数 (3030): 这是端口号,一个唯一的标识符,用于指定服务器上客户端希望连接的特定进程。端口号的范围是 0 到 65535,像 HTTP 的端口 80 这样的知名端口通常保留给特定服务。

2. 数据交互

在通过套接字连接交换数据时,使用流进行输入和输出。

  • 输入流从套接字读取数据。
  • 输出流通过套接字发送数据。

例如,访问这些流:

示例:客户端

示例

解释

它建立服务器和客户端之间的连接。它使用 Scanner 读取用户输入,使用 DataOutputStream 发送数据,并使用 try-with-resources 块自动管理连接的 Socket。客户端将持续提示用户输入消息并将其转发到服务器,直到用户键入“Over”。

try-with-resources 块确保即使发生错误,所有资源也能被正确关闭,并且代码会处理任何可能的 UnknownHostException 或 IOException 错误。main 方法只是创建一个新的 Client 对象来启动此过程。

服务器端编程

服务器应用程序的主要职责是监听并接受传入的客户端连接。它为此目的使用一种特殊的 **套接字**,称为 **ServerSocket**。服务器必须首先绑定到一个特定的端口号。服务器将在此端口上“监听”来自客户端的连接请求。

一旦客户端尝试连接,ServerSocket 就会接受连接,从而创建一个新的 Socket 对象,专门用于与该特定客户端通信。这允许服务器并发处理多个客户端,因为原始的 ServerSocket 保持打开状态以接受新连接。

语法

示例:服务器端

示例

输出

Socket Programming in Java

解释

当创建 Server 对象时,它会初始化一个 ServerSocket 来等待传入的连接。然后程序会打印一条消息,表明它正在等待客户端。当客户端连接时,serverSocket.accept() 方法将返回一个 Socket 对象,它是连接的表示。

然后将套接字的输入流转换为 DataInputStream,以便可以读取客户端的数据。服务器进入一个循环,重复读取并打印客户端发送的消息,直到收到“Over”消息,指示连接结束。

结论

Java 套接字编程为创建网络应用程序提供了一个坚实的基础。它基于套接字的基本概念,套接字充当客户端和服务器之间双向数据交换的通信点。客户端创建套接字以连接到服务器的 IP 地址和端口,服务器创建服务器套接字以监听特定端口上的连接请求。一旦建立连接,I/O 流就允许在客户端和服务器之间发送和接收数据。

Java 套接字编程选择题

Q1. Java 中的套接字编程允许客户端和服务器之间的网络通信,套接字充当此通信的 _______。

  1. 终结点
  2. 协议
  3. interface
  4. 管道
 

答案: a)

解释:套接字的功能是充当客户端和服务器之间“此通信的终结点”。


Q2. 在服务器端,使用 ________ 方法等待客户端连接到指定端口。

  1. accept()
  2. connect()
  3. listen()
  4. bind()
 

答案: a)

解释:服务器调用 ServerSocket 类的 accept() 方法,该方法“等待”直到客户端连接到服务器。


Q3. 客户端应用程序通过创建 __________ 对象与服务器名称和端口号建立连接。

  1. ClientSocket
  2. ServerSocket
  3. ServerConnection
  4. Socket
 

答案: d)

解释:内容明确说明,客户端实例化一个 Socket 对象,并指定服务器 IP 和端口号以进行连接。


Q4. 套接字构造函数中的第二个参数,例如 3030,代表 ________。

  1. 端口号
  2. 服务器名称
  3. 超时值
  4. 缓冲区大小
 

答案: a)

解释:Socket 构造函数中的第二个参数是端口号,一个唯一的标识符,用于指定服务器上客户端希望连接的特定进程。


Q5. 在客户端,使用 ______ 流从套接字读取数据。

  1. 输入
  2. 输出
  3. 数据
  4. 连接
 

答案: a)

解释:客户端编程部分明确说明,输入流用于从套接字读取数据。