您的位置:首页 > 理论基础 > 计算机网络

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

2016-04-05 12:27 387 查看
分布式计算课程的第一个作业是写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版本的后面会写出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: