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

分布式计算课程的第一个作业是写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();
			}
		}
	}
}

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;	//生成普通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版本的后面会写出来。

你可能感兴趣的:(分布式,Daytime协议,TCP方式)