分布式计算——Daytime协议的实现(TCP版)

来源:互联网 发布:淘宝店铺搜索器 编辑:程序博客网 时间:2024/05/16 14:18

分布式计算课程的第一个作业是写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;//生成一个普通socketObjectOutputStream 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();//关闭服务socketsocket.close();//关闭socket}catch(IOException e){e.printStackTrace();}}}}

Time.java

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;}}

客户端代码:(主要部分是Examplea,还有一个Time类(同上)负责接收处理服务器端传递过来的对象)

Example.java

import java.io.ObjectInputStream;import java.net.Socket;public class Examplea {public static void main(String[] args) {Socket socket = null;//生成普通socketObjectInputStream 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版本的后面会写出来。

1 0
原创粉丝点击