Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Note: Use Java Write a web server that is capable of processing only 1 request.

ID: 3789629 • Letter: N

Question

Note: Use Java

Write a web server that is capable of processing only 1 request. Your web server will: Create a connection socket when contacted by the client (browser) Receive the HTTP request from this connection Parse the request to determine the specific file being requested Get the requested file from the server's file system Create an HTTP response message consisting of the requested file Send the response over TCP Connection to the requesting browser If a client requests a file that is not present in your server, your server should return a "404 Not Found" error message.

Explanation / Answer

For this problem we will create a UI using swings library. also we will create a separate WebServer class for

the server implementation. We will run the server in a separate thread and for this we will use Thread class.

Class UI:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/* this class contains A simple Swing UI.
* which has one start button and one txt console
*/
public class UI extends JFrame {

   static Integer portNumber = null;
   JPanel mainPanel;
   JScrollPane scrollPane;
   JButton btnStartServer;
   JTextArea textArea_1;
   public UI() {
       mainPanel = new JPanel();
       scrollPane = new JScrollPane();
       btnStartServer = new JButton("Start Server");
       btnStartServer.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {
               startServer();
           }
       });
       getContentPane().add(btnStartServer, BorderLayout.SOUTH);
      
       textArea_1 = new JTextArea();
       textArea_1.setBackground(Color.BLACK);
       textArea_1.setForeground(new Color(255, 255, 255));
       textArea_1.setRows(30);
       textArea_1.setColumns(30);
       getContentPane().add(textArea_1, BorderLayout.CENTER);
       textArea_1.setBorder(BorderFactory.createLoweredBevelBorder());
       textArea_1.setEditable(false);
      
       this.setTitle("Simple Web Server");
       this.addWindowListener(new java.awt.event.WindowAdapter() {
           public void windowClosing(WindowEvent e) {
               close(e);
           }
       });
       scrollPane.setViewportView(textArea_1);
       mainPanel.add(scrollPane);
       this.getContentPane().add(mainPanel, BorderLayout.EAST);
       this.setVisible(true);
       this.setSize(350,300);
       this.setResizable(false);
       this.validate();
      
   }
   private void startServer() {
       new WebServer(portNumber.intValue(), this);
   }
   void close(WindowEvent event) {
       System.exit(1);
   }
   public void displayMessage(String s) {
       textArea_1.append(s);
   }
   public static void main(String[] args) {
       portNumber = new Integer(8080);
       UI ui = new UI();
   }
}

Class WebServer :

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer extends Thread {

   private UI message_to; // need UI to display Message
   private int portNumber; //need port to run on localhost

   //Constructor, takes portNumber and UI as input
   public WebServer(int portNumber, UI ui) {
       this.message_to = ui;
       this.portNumber = portNumber;
       this.start();
   }

   // Thread implementation, overriding run method to run server in separate thread
  
   public void run() {
       ServerSocket socket = null;
       sendMessage("Starting Server. . . ");
       try {
           sendMessage("Checking port " + Integer.toString(portNumber) + ". . . . . ");
           socket = new ServerSocket(portNumber);
       }
       catch (Exception exception) {
           sendMessage("Error:" + exception.getMessage());
           return;
       }
       sendMessage("Started . . . ");
       while (true) {
           sendMessage("Ready and awaiting for requests. . . ");
           try {
               Socket cSocket = socket.accept();
               InetAddress address = cSocket.getInetAddress();
               sendMessage(address.getHostName() + " connected to server. ");
               BufferedReader reader =new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
               DataOutputStream outputStream =new DataOutputStream(cSocket.getOutputStream());
               serviceRequest(reader, outputStream);
           }
           catch (Exception exception) {
               sendMessage(" Error:" + exception.getMessage());
           }

       }
   }

   private void serviceRequest(BufferedReader reader, DataOutputStream outputStream) {
       boolean isGet=false;
       String path = new String();
       try {
           String str1 = reader.readLine();
           String str2 = new String(str1);
           str1.toUpperCase();
           if (str1.startsWith("GET")) {
               isGet=true;
           }else if (str1.startsWith("HEAD")) { //
           }else {
               try {
                   outputStream.writeBytes(constructHeader(501, 0));
                   outputStream.close();
                   return;
               }
               catch (Exception exception) {
                   sendMessage("Error:" + exception.getMessage());
               }
           }
           int first = 0;
           int last = 0;
           for (int a = 0; a < str2.length(); a++) {
               if (str2.charAt(a) == ' ' && first != 0) {
                   last = a;
                   break;
               }
               if (str2.charAt(a) == ' ' && first == 0) {
                   first = a;
               }
           }
           path = str2.substring(first + 2, last);
       }
       catch (Exception exception) {
           sendMessage("Error:" + exception.getMessage());
       }
       sendMessage(" Requested file:" + new File(path).getAbsolutePath() + " ");
       FileInputStream inputStream = null;

       try {
           inputStream = new FileInputStream(path);
       }
       catch (Exception exception) {
           try {
               outputStream.writeBytes(constructHeader(404, 0));
               outputStream.close();
           }
           catch (Exception e) {
               sendMessage("Error: " + e.getMessage());
           }
           sendMessage("Error: " + exception.getMessage());
       }


       try {
           int type = 0;

           if (path.endsWith(".jpg") || path.endsWith(".jpeg")) {
               type = 1;
           }else if (path.endsWith(".gif")) {
               type = 2;
           }else if (path.endsWith(".zip") || path.endsWith(".exe")|| path.endsWith(".tar")) {
               type = 3;
           }

           outputStream.writeBytes(constructHeader(200, type));

           if (isGet) {
               while (true) {
                   int b = inputStream.read();
                   if (b == -1) {
                       break;
                   }
                   outputStream.write(b);
               }

           }
           outputStream.close();
           inputStream.close();
       }

       catch (Exception exception) {
           sendMessage("Error: " + exception.getMessage());
       }

   }
   private String constructHeader(int return_code, int type) {
       String header = "HTTP/1.0 ";
       switch (return_code) {
       case 200:
           header = header + "200 OK";
           break;
       case 404:
           header = header + "404 Not Found";
           break;
       }

       header = header + " ";
       header = header + "Connection: close ";
       header = header + "Server: SimpleWebServer v0 ";

       switch (type) {
       case 0:
           break;
       case 1:
           header = header + "Content-Type: image/jpeg ";
           break;
       case 2:
           header = header + "Content-Type: image/gif ";
       case 3:
           header = header + "Content-Type: application/x-zip-compressed ";
       default:
           header = header + "Content-Type: text/html ";
           break;
       }

       header = header + " ";
       return header;
   }
   private void sendMessage(String message) {
       message_to.displayMessage(message);
   }
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote