分布式计算课程的第一个作业是写Daytime协议。
问:什么是Daytime协议?
答:Daytime是一个有用的调试和测量工具。无论输入请求是什么,daytime只是简单地以字符串形式返回当前的日期和时间。
问:Daytime协议返回格式是?
答:Daytime服务没有特别的语法。建议使用Ascii可打印字符,空格、回车和换行。Daytime限制在一行。语法如下:
Weekday, Month Day, Year Time-Zone。例子:Tuesday, February 22, 2015 18:33:45-BST
问:什么是TCP版本的Daytime协议?
答:在TCP上基于连接的应用。 Daytime服务器在TCP端口13上监听TCP连接请求。一旦连接建立,
当前的日期和时间以Ascii字符串的形式,通过该连接返回请求者,它丢弃接收到的所有数据。发送完毕,服务器关闭此连接。
问:TCP版和UDP版的区别?
答:TCP是基于连接的,UDP是无连接的。基于连接的就是相当于打电话一样,可以使用流的方式来进行通信。
而UDP方式则是无连接的,相当于发短信一样,其数据是以数据报文的方式进行传递的。
===================================================================分割线
以下是程序实现部分:
程序分为客户端可服务器端两个部分,
客户端负责发送请求,服务器端负责监听相应端口,以及对请求的处理。
这里的处理也就只是返回当前的时间和日期。
服务器端代码如下:(两部分,一个Exampleb是主要部分,还有一个自定义的Time类)
Example.java
import java.io.IOException; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Exampleb { public static void main(String[] args){ ServerSocket serverSocket = null; //生成服务socket对象 Socket socket = null; //生成一个普通socket ObjectOutputStream objOutputStream = null;//生成对象输出流对象 try{ serverSocket = new ServerSocket(13);//监听端口13,参数为端口号 System.out.println("Server服务已经启动。。。。"); socket = serverSocket.accept(); //在此进行就开始监听,一直阻塞在这,直到有请求发来 Time time = new Time(); //初始化时间对象 objOutputStream = new ObjectOutputStream(socket.getOutputStream());//将socket的输出流包装在对象输出流中 objOutputStream.writeObject(time);//将time对象写入到对象输出流中 }catch(Exception e){ e.printStackTrace(); }finally{ try{ serverSocket.close();//关闭服务socket socket.close(); //关闭socket }catch(IOException e){ e.printStackTrace(); } } } }
import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @SuppressWarnings("serial") public class Time implements Serializable{ SimpleDateFormat sd = null; //初始化一个时间格式对象,以对应Daytime协议的时间格式 String time; //最终以字符串的形式返回 public Time(){ sd = new SimpleDateFormat("dd MMM yy hh:mm:ss zzz");//实例化时间格式对象 time = sd.format(new Date()); //使用Date()获取当前时间日期,案后通过format方法修改格式 } public String getTime(){ //通过此方法来返回最终的时间 return time; } }
Example.java
import java.io.ObjectInputStream; import java.net.Socket; public class Examplea { public static void main(String[] args) { Socket socket = null; //生成普通socket ObjectInputStream objectInputStream = null;//生成对象输入流对象 try{ socket = new Socket("localhost", 13);//此socket负责访问本地13号端口 socket.setSoTimeout(10000); //设置访问超时的时限,此处设置为10秒 objectInputStream = new ObjectInputStream(socket.getInputStream());//将输入流包装在对象输入流中 Time time = (Time)objectInputStream.readObject();//从对象输入流中获取对象,并转换成Time类 System.out.println(time.getTime());//通过Time类中的getTime()方法获取时间,并打印 }catch(Exception e){ e.printStackTrace(); }finally{ try{ socket.close(); }catch(Exception e){ e.printStackTrace(); } } } }
运行截图:
服务器端:
客户端:
===================================================================分割线
问题:
返回的时间格式上还有些问题,尝试了两种格式,但是都没能调成Daytime协议的格式。
算了,不管了。- -
UDP版本的后面会写出来。