题目:
构建循环,面向连接ECHO&TIME服务器
( 设计一个基于TCP的应用层协议,服务器收到客户发来的字符串后,加上时间标记再回射给客户。)
要求:
- 定义一个应用层协议
- 服务器算法设计
- 源代码
1. 定义一个应用层协议
基于TCP的ECHO&TIME的连接应用,绑定端口6789并实行监听,一旦建立了连接,当前的日期和时间就会和客户发送的消息进行连接后,以ascii字符串的形式被送出连接, 该服务在发送完后立即关闭连接
2. 服务器算法设计
-
创建套接字并将其绑定到他所提供服务的端口上,自定义为6789
-
将给端口设置为被动模式,使其准备为服务器所用
-
从该套接字上接受下一个连接请求,构造获得该连接的套接字
-
读取来自客户的需求,构造响应,按照应用协议向客户发回响应,此处构造的响应应为,先获取客户端传递过来的消息,再调用本地的time获取时间,然后拼接后返回给客户
-
关闭连接,并返回步骤3以接受新的连接
3. 源代码
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class TCPServer
{
public static void main(String argv[]) throws Exception
{
//设置服务器接收和发送的字符
String clientSentence;
String returnSentence;
//开启服务端口6789
ServerSocket welcomeSocket = new ServerSocket(6789);
//时间格式化
SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateTimeInstance();
Calendar calendar= Calendar.getInstance();
System.out.println("服务器已经开启...");
while (true)
{
//监听获取套接字
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
//读入用户输入
clientSentence = inFromClient.readLine();
returnSentence=clientSentence;
//获取时间后拼接
returnSentence+=sdf.format(calendar.getTime());
//写回
outToClient.writeBytes(returnSentence);
connectionSocket.close();
}
}
}
结果:
使用telnet连接后,返回结果正确