在Java网络编程中,服务器通过ServerSocket
类监听客户端连接,并使用Socket
的输入输出流向客户端发送响应。响应可以是字符串、二进制数据或序列化对象,具体取决于应用需求。本文将通过三个示例展示如何实现这些响应类型,结合权威资源,提供从基础到实践的全面指南。内容适合初学者和中级开发者,旨在帮助读者掌握Java服务器端编程的核心技术。
1. 服务器端编程基础
ServerSocket
是Java java.net
包中的核心类,用于在服务器端创建套接字,监听特定端口以接受客户端连接。与客户端使用的Socket
类不同,ServerSocket
专注于等待连接,而Socket
用于实际通信。以下是服务器端编程的基本步骤 流程:
- 创建ServerSocket:绑定到指定端口。
- 接受连接:调用
accept()
方法,等待客户端连接,返回Socket
对象。 - 处理通信:通过
Socket
的输入输出流与客户端交换数据。
本文将重点探讨如何通过Socket
的输出流发送不同类型的响应:字符串、二进制数据和序列化对象。
1.1 响应类型的选择
响应类型 | 适用场景 | 使用的流类 | 优点 | 缺点 |
---|---|---|---|---|
字符串 | 文本协议(如HTTP、Echo) | BufferedReader 、PrintWriter |
易于调试,人类可读 | 效率较低,需处理字符编码 |
二进制 | 高效数据传输(如时间戳、图像) | DataInputStream 、DataOutputStream |
高效,格式精确 | 需定义协议,调试复杂 |
对象 | 复杂数据结构 | ObjectInputStream 、ObjectOutputStream |
简化复杂数据传输 | 序列化开销,需确保对象可序列化 |
2. 示例一:Echo Server - 字符串响应
2.1 功能概述
Echo Server是一个简单的服务器,它接收客户端发送的文本行并原样返回,常用于测试网络连接或调试客户端程序。它使用BufferedReader
读取客户端输入,PrintWriter
发送响应,确保数据以文本形式传输。
2.2 代码实现
以下是Echo Server的完整实现:
import java.io.*;
import java.net.*;
public class EchoServer {
protected ServerSocket sock;
public final static int ECHOPORT = 7;
protected boolean debug = true;
public static void main(String[] args) {
int p = ECHOPORT;
if (args.length == 1) {
try {
p = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.err.println("Usage: EchoServer [port#]");
System.exit(1);
}
}
new EchoServer(p).handle();
}
public EchoServer(int port) {
try {
sock = new ServerSocket(port);
} catch (IOException e) {
System.err.println("I/O error in setup");
System.err.println(e);
Sys