题目:

构建循环,面向连接ECHO&TIME服务器

( 设计一个基于TCP的应用层协议,服务器收到客户发来的字符串后,加上时间标记再回射给客户。)

要求:

  1. 定义一个应用层协议
  2. 服务器算法设计
  3. 源代码

1. 定义一个应用层协议

基于TCP的ECHO&TIME的连接应用,绑定端口6789并实行监听,一旦建立了连接,当前的日期和时间就会和客户发送的消息进行连接后,以ascii字符串的形式被送出连接, 该服务在发送完后立即关闭连接

2. 服务器算法设计

  1. 创建套接字并将其绑定到他所提供服务的端口上,自定义为6789

  2. 将给端口设置为被动模式,使其准备为服务器所用

  3. 从该套接字上接受下一个连接请求,构造获得该连接的套接字

  4. 读取来自客户的需求,构造响应,按照应用协议向客户发回响应,此处构造的响应应为,先获取客户端传递过来的消息,再调用本地的time获取时间,然后拼接后返回给客户

  5. 关闭连接,并返回步骤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();
		}
	}
}

结果:

image-20220328120322951

使用telnet连接后,返回结果正确
image-20220328120512633

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐