otarza / serv-cst

CST web III porject
6 stars 0 forks source link

სერვერის რეალიზაცია #28

Closed ioseb closed 11 years ago

ioseb commented 11 years ago
  1. სერვერ სოკეტი
  2. უწყვეტი ციკლი
  3. კლიენტისგან მოთხოვნის მიღება და დამუშავება
  4. ტაიმაუტები.

ეს არის ძალიან ზედაპირული არამრავალნაკადური ნიმუში. დასტარტვის შემდეგი შეგიძლია დაუკავშირდე ტელნეტით: telnet localhost 9191

package test;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;

        try {
            serverSocket = new ServerSocket(9191);

            while (true) {
                Socket socket = serverSocket.accept();
                socket.setSoTimeout(10000);
                process(socket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void process(Socket socket) {
        try {
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            int contentLength = 10;
            String line;
            List<String> httpMessage = new ArrayList<String>();

            while ((line = bufferedReader.readLine()) != null) {
                httpMessage.add(line);

                if (line.length() == 0) {
                    ByteArrayOutputStream entityBody = new ByteArrayOutputStream();

                    try {
                        byte[] remaining = new byte[contentLength];
                        int read = inputStream.read(remaining);
                        if (read > -1) {
                            entityBody.write(remaining);
                        }
                    } catch (IOException e) {
                        break;
                    }

                    for (String messageLine : httpMessage) {
                        System.out.println(messageLine);
                    }

                    socket.close();
                    return;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
demonno commented 11 years ago
  1. მოთხოვნის ტექსტი იკითხება მთლიანად და იწერება List<String> httpMessage ლისტში
    • თუ წარმატებიტ გაპარსა, -> httpMessage ლისტიდან ვშლით მოთხობნის ტექსტს
    • HttpRequestLine ობიექტში გვექნება დამუშავებული მოთხოვნის სტრიქონი
    • HttpRequestLineParser - კლასმა თუ ვერ გაპარსა response ით ვაბრუნებთ სტატუსს BAD_REQUEST
  2. ვკითხულობთ ჰედერებს და ვაგროვებთ იგივე httpMessage ლისტში
    • შექმნილ ლისტს გადავცემთ HttpHeaderFieldParser კლასს
    • წარმატების შემთხვევაში დგვიბრუნებს ჰედერების Map<String, String> headers, _ს
    • თუ ვერ გაპარსავს response ით ვაბრუნებთ სტატუსს BAD_REQUEST
  3. ყველა საჭირო რესური გვაქ იმისთვის რომ მოტხოვნის ობიექტი შევქმნათ
    • HttpRequestWrapper(requestLine,headers,""); კლასის ინსტანსის შექმნით მივიღებთ HttpRequest ობიექტს რომელიც თავისმხრივ ატარებს ყველა საჭირო ინფორმაციას შემდგომი დამუშავებისთვის
  4. ვიძახებთ HttpRequestDispatcher კლასს და კონსტრუქტორს გადავცემთ HttpRequest ობიექტს
    • დისპაჩერ კლასი ამუშავებს მოთხოვნას #20
    • ველოდებით პასუხს
    • გადავცემთ ამ პასუხს კლიენტს
ioseb commented 11 years ago

@demonno ძირითადი ამოცანა გადაჭრილია, შეგვიძლია დავხუროთ.