目录
一、前言
- 简要介绍Socket编程的概念以及其在网络通信中的重要性。
- 说明实验目标:通过Socket编程实现一个简单的服务器-客户端应用,客户端请求当前时间,服务器返回时间数据。
二、代码环境
- 语言:Java
- 开发工具:IntelliJ IDEA
- 操作系统:Windows
- 其他依赖:标准库即可
三、服务器端设计
- 服务器端逻辑:
- 监听8888端口,等待客户端链接。
- 接受客户端的请求,如果收到 getdatetime,则获取服务器当前时间。
- 将当前时间以 yyyy-MM-dd HH:mm:ss 的格式返回给客户端。
- 关闭连接。
- 服务器端代码实现:
- 使用 ServerSocket 来创建服务器监听指定端口。
- 使用 BufferReader 读取客户端请求。
- 使用 PrintWriter 向客户端返回数据。
- 相关解释:
- accept() 阻塞等待客户端链接。
- 时间的格式化使用 simpleDateFormat类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SockerServer {
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(8888)){
System.out.println("服务端监听端口8888");
while (true){
//等待客户端链接
Socket socket = serverSocket.accept();
System.out.println("客户端链接成功!");
//读取客户端发送数据
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String req = in.readLine();
//判断是否为“getdatetime”请求
if("getdatetime".equals(req)){
//获取当前格式化时间
String currentTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(currentTime);
System.out.println("消息来自客户端: " + currentTime);
}
socket.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
四、客户端设计
- 客户端逻辑:
- 连接到 8888 端口。
- 发送请求字符串 getdatetime 。
- 接受服务器返回的时间字符串并显示。
- 关闭连接。
- 客户端代码实现:
- 使用 Socket 类连接到服务器。
- 发送请求并通过 BufferReader 接收响应。
- 相关解释:
- 通过流的方式进行数据传输:PrintWriter 和 BufferReader 。
package socket_test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args) {
try(Socket socket = new Socket("localhost", 8888)){
//发送请求字符
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("getdatetime");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String serverResponse = in.readLine();
//显示服务器返回时间
System.out.println("当前服务器时间: " + serverResponse);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
五、结果展示
总结
这个简单的时间请求服务展示了以下关键点:
-
Socket编程基础:学习如何使用 ServerSocket 和 Socket 类建立服务器和客户端之间的连接,以及如何通过输入输出流进行数据传输。
-
网络通信流程:服务器端监听一个端口并等待客户端连接,当客户端发送请求后,服务器处理请求并返回相应的数据,最后双方关闭连接。
-
时间格式化处理:使用SimpleDateFomat类来格式化日期时间,符合实际应用中的常见需求。
-
简单的客户端-服务器模型:通过这个实验,掌握了如何实现基本的客户端与服务器之间的单向通信模型。