//1. 客户方程序 QuoteClient.java
import java.io.*;
import java.net.*;
import java.util.*;
class QuoteClient {
if (args.length != 1) {
// 如果启动的时候没有给出Server的名字,那么出错退出
System.
out.
println("Usage:java QuoteClient <hostname>");
// 打印出错信息
return; // 返回
}
// 创建数据报套接字
byte[] buf = new byte[256]; // 创建缓冲区
// 由命令行给出的第一个参数默认为Server的名字,通过它得到Server的IP信息
4445);
// 创建DatagramPacket对象
socket.send(packet); // 发送
// 创建新的DatagramPacket对象,用来接收数据报
socket.receive(packet); // 接收
// 根据接收到的字节数组生成相应的字符串
System.
out.
println("Quote of the Moment:" + received
);
// 打印生成的字符串
socket.close(); // 关闭套接口
}
}
// 2. 服务器方程序:QuoteServer.java
class QuoteServer {
new QuoteServerThread().start();
// 启动一个QuoteServerThread线程
}
}
// 3. 程序QuoteServerThread.java
// 服务器线程
class QuoteServerThread
extends Thread {
// 记录和本对象相关联的DatagramSocket对象
// 用来读文件的一个Reader
protected boolean moreQuotes = true;
// 标志变量,是否继续操作
// 无参数的构造函数
this("QuoteServerThread");
// 以QuoteServerThread为默认值调用带参数的构造函数
}
super(name); // 调用父类的构造函数
// 在端口4445创建数据报套接字
try {
// 打开一个文件,构造相应的BufferReader对象
.println("Could not open quote file. Serving time instead.");
// 打印出错信息
}
}
public void run() // 线程主体
{
while (moreQuotes) {
try {
byte[] buf = new byte[256]; // 创建缓冲区
// 由缓冲区构造DatagramPacket对象
socket.receive(packet); // 接收数据报
if (in == null)
dString
= new Date().
toString();
// 如果初始化的时候打开文件失败了,
// 则使用日期作为要传送的字符串
else
dString = getNextQuotes();
// 否则调用成员函数从文件中读出字符串
buf = dString.getBytes();
// 把String转换成字节数组,以便传送
// 从Client端传来的Packet中得到Client地址
int port = packet.getPort(); // 和端口号
// 根据客户端信息构建DatagramPacket
socket.send(packet); // 发送数据报
e.printStackTrace(); // 打印错误栈
moreQuotes = false; // 标志变量置false,以结束循环
}
}
socket.close(); // 关闭数据报套接字
}
protected String getNextQuotes
() {
// 成员函数,从文件中读数据
try {
if ((returnValue = in.readLine()) == null) {
// 从文件中读一行,如果读到了文件尾
in.close(); // 关闭输入流
moreQuotes = false;
// 标志变量置false,以结束循环
returnValue = "No more quotes. Goodbye.";
// 置返回值
} // 否则返回字符串即为从文件读出的字符串
returnValue = "IOException occurred in server";
// 置异常返回值
}
return returnValue; // 返回字符串
}
}