【Practical】SMTP协议Java模拟实现(IntelliJ IDEA 2019.3.2环境)

/*
 * SMTP client simulation.
 *
 * Created at 2020.6.14 by Espernato.
 * Copyright @ 2020 Espernato.
 * All rights reserved.
 *
 */

import java.io.*;
import java.net.*;

public class SMTPClient
{

    public static void main(String[] args)
    {
        try
        {
            Socket my_socket = new Socket(InetAddress.getByName("127.0.0.1"),8001);
//			The server must be launched first,otherwise exception should be thrown to inform user.

//			In regard to the same connection,the output stream of server is also the input stream
//			of client,and the input stream of server is also the output stream of server.

//			Launch input stream.
            InputStream input_stream = my_socket.getInputStream();
//			Wrap input stream with BufferedReader.
            BufferedReader buffer_reader_Net =
                    new BufferedReader(new InputStreamReader(input_stream));

//			Launch output stream.
            OutputStream output_stream = my_socket.getOutputStream();

            DataOutputStream data_output_stream =
                    new DataOutputStream(output_stream);
//			Wrap output stream with BufferedReader.
            BufferedReader buffer_reader_Key =
                    new BufferedReader(new InputStreamReader(System.in));

//			Show some promotions.
            System.out.println("┏━━━━━━━━━━━━━━━Inofomation━━━━━━━━━━━━━━┓");
            System.out.println("┃ Welcome to Mail-World.                 ┃");
            System.out.println("┃ You can write your message below.	     ┃");
            System.out.println("┃ We will finish all things rest.        ┃");
            System.out.println("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");

            while(true)
            {
                System.out.print("【Message】");
                String message_to_send = buffer_reader_Key.readLine();
//				Store the message that wait to be sent.

//				Judge user want quit or not.
                if(message_to_send.equalsIgnoreCase("quit"))
                {
                    break;
                }
                else
                {
//					Show promotion about user's message.
                    System.out.println("【I(Client) want to send:"+message_to_send+"】");
                    data_output_stream.writeBytes(message_to_send+System.getProperty("line.separator"));

                    System.out.println("【Server replied:"+buffer_reader_Net.readLine()+"】");
                }
            }

//			Close all the streams and socket.
            data_output_stream.close();
            buffer_reader_Net.close();
            buffer_reader_Key.close();
            my_socket.close();

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

/*
 * SMTP server simulation.
 *
 * Created at 2020.6.14 by Espernato.
 * Copyright @ 2020 Espernato.
 * All rights reserved.
 *
 */

import java.net.*;
public class SMTPServerPro
{

    public static void main(String[] args)
    {
        try
        {
//			Construct a server socket.
            ServerSocket my_socket_server = new ServerSocket(8001);

//			Show some promotions.
            System.out.println("┏━━━━━━━━Infomation━━━━━━━━━┓");
            System.out.println("┃ Welcome to Mail-World.    ┃");
            System.out.println("┃ Here is Server for you.   ┃");
            System.out.println("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");

            while(true)
            {
//				Deal with the message that was sent by client.
                Socket one_server = my_socket_server.accept();
                System.out.println("【A client has been accepted.】");

//				Launch a new thread to deal with each client.
                new Thread(new Worker(one_server)).start();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}

/*
 * Vital class:Worker.
 *
 * Created at 2020.6.14 by Espernato.
 * Copyright @ 2020 Espernato.
 * All rights reserved.
 *
 */

import java.net.*;
import java.io.*;
public class Worker implements Runnable
{
    Socket my_socket;

    //	Constructor.
    public Worker(Socket s)
    {
        this.my_socket = s;
    }

    //	Overwrite function run().
    public void run()
    {
        try
        {
//			Show some promotions.
            System.out.println("【Server is in place.】");

//			Create the input stream & output stream.
            InputStream input_stream = my_socket.getInputStream();
            OutputStream output_stream = my_socket.getOutputStream();

            BufferedReader buffer_reader =
                    new BufferedReader(new InputStreamReader(input_stream));

            DataOutputStream data_output_stream =
                    new DataOutputStream(output_stream);

            while(true)
            {
//				Store the message that is received.
                String message_received = buffer_reader.readLine();

                if(message_received==null)
                {
                    System.out.println("【One client has left.】");
                    break;
                }

                System.out.println("【Client has sent a message : "
                        +message_received
                        +"---Message-Length:"
                        +message_received.length()+"】");

//				Judge client want to quit or not.
                if(message_received.equalsIgnoreCase("quit"))
                {
                    break;
                }

//				Reply to client,denote that server has got his message successfully.
                String strEcho = "Your message have been received!Totally,"
                        +message_received.length()+" letters.";
                System.out.println("【Server has replied.】");
                data_output_stream.writeBytes(strEcho+System.getProperty("line.separator"));
            }

//			Close all the streams & socket.
            buffer_reader.close();
            data_output_stream.close();
            my_socket.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/106929191