View Full Version : سوال: Web Server in java
sajjad4563
جمعه 21 شهریور 1393, 02:08 صبح
با سلام
یه سئوال کلی:
آیا وب سرور، خودش یه نمونه از مدل client - server هست؟
چجوری بوسیله سوکت ها در جاوا، بتونیم یه وب سرور ساده بنویسیم؟ (نه با استفاده از کلاسهای آماده ای مثل HttpServer)
میخوام شروع کنم یه وب سرور بنویسم، لطفا کمکم کنید.
با تشکر.
cups_of_java
جمعه 21 شهریور 1393, 08:14 صبح
بله هست.
شما باید با استفاده از لایبرری های سوکت و io بتونید این کار رو انجام بدید و یک پروتکل (مثلن اگه سرور وب میخواید بنویسید پروتکل HTTP) رو پیاده سازی کنید.
البته همه اجزای این پازل آماده برای شما هست... می تونید لایبرری های جاواش رو پیدا کنید و بهم بچسبونید.
ضمنن من توصیه میکنم یه سرور http سطح پایین که مثل لایببری می مونه رو بردارید (مثل jetty, grizzly, apache MINA, ... ) و با اون پیاده سازی کنید سرور خودتون رو (اگه non blocking هم باشه بسیار عالی)
این رو هم می تونی ببینی (http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html) با اینکه من باشم Multithread رو در حالت thread per user پیاده سازی نمی کنم.
sajjad4563
جمعه 21 شهریور 1393, 22:37 عصر
بله هست.
شما باید با استفاده از لایبرری های سوکت و io بتونید این کار رو انجام بدید و یک پروتکل (مثلن اگه سرور وب میخواید بنویسید پروتکل HTTP) رو پیاده سازی کنید.
البته همه اجزای این پازل آماده برای شما هست... می تونید لایبرری های جاواش رو پیدا کنید و بهم بچسبونید.
ضمنن من توصیه میکنم یه سرور http سطح پایین که مثل لایببری می مونه رو بردارید (مثل jetty, grizzly, apache MINA, ... ) و با اون پیاده سازی کنید سرور خودتون رو (اگه non blocking هم باشه بسیار عالی)
این رو هم می تونی ببینی (http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html) با اینکه من باشم Multithread رو در حالت thread per user پیاده سازی نمی کنم.
ممنون بابت پاسختون
میتونید یکم کمکم کنید از ابتدا میخوایم یه سرور خیلی خیلی ساده رو شروع کنم
به مباحث سوکت هم آشنا هستم
نمونه مثال دارین؟
مثلا وب سرور ابتدایی من باید چی هارو بگیره و چیکار انجام بده؟
میشه شما برا من تعریف کنین؟
ممنونم
A.iman
جمعه 21 شهریور 1393, 22:42 عصر
وب سروری که داری مینویسی روی http کار خواهد کرد ، پس بنابراین باید تمامی اون مشخصات هدر فایل رو بنویسی تا مرورگر بتونه با وب سرورت ارتباط ایجاد کنه .
این یه مثال ساده :
public class WebServer {
/**
* WebServer constructor.
*/
protected void start() {
ServerSocket s;
System.out.println("Webserver starting up on port 80");
System.out.println("(press ctrl-c to exit)");
try {
// create the main server socket
s = new ServerSocket(80);
} catch (Exception e) {
System.out.println("Error: " + e);
return;
}
System.out.println("Waiting for connection");
for (;;) {
try {
// wait for a connection
Socket remote = s.accept();
// remote is now the connected socket
System.out.println("Connection, sending data.");
BufferedReader in = new BufferedReader(new InputStreamReader(
remote.getInputStream()));
PrintWriter out = new PrintWriter(remote.getOutputStream());
// read the data sent. We basically ignore it,
// stop reading once a blank line is hit. This
// blank line signals the end of the client HTTP
// headers.
String str = ".";
while (!str.equals(""))
str = in.readLine();
// Send the response
// Send the headers
out.println("HTTP/1.0 200 OK");
out.println("Content-Type: text/html");
out.println("Server: Bot");
// this blank line signals the end of the headers
out.println("");
// Send the HTML page
out.println("<H1>Welcome to the Ultra Mini-WebServer</H2>");
out.flush();
remote.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
/**
* Start the application.
*
* @param args
* Command line parameters are not used.
*/
public static void main(String args[]) {
WebServer ws = new WebServer();
ws.start();
}
}
این روی پروت 80 کار میکنه ، یعنی اگر بنویسی : localhost:80 یه کانکشن بین تو و وبسرور ایجاد میشه .
in و out همون هدر های http ی ما داخلش هستن ، بعد اون حلقه while هم داره خط به خط اون http رو که مروزگر فرستاده رو میخونه و در نهایت یه پیغامی نشون میده و کانکشن رو میبنده . البته که مثال ساده ایه ...
sajjad4563
شنبه 22 شهریور 1393, 01:19 صبح
وب سروری که داری مینویسی روی http کار خواهد کرد ، پس بنابراین باید تمامی اون مشخصات هدر فایل رو بنویسی تا مرورگر بتونه با وب سرورت ارتباط ایجاد کنه .
این یه مثال ساده :
public class WebServer {
/**
* WebServer constructor.
*/
protected void start() {
ServerSocket s;
System.out.println("Webserver starting up on port 80");
System.out.println("(press ctrl-c to exit)");
try {
// create the main server socket
s = new ServerSocket(80);
} catch (Exception e) {
System.out.println("Error: " + e);
return;
}
System.out.println("Waiting for connection");
for (;;) {
try {
// wait for a connection
Socket remote = s.accept();
// remote is now the connected socket
System.out.println("Connection, sending data.");
BufferedReader in = new BufferedReader(new InputStreamReader(
remote.getInputStream()));
PrintWriter out = new PrintWriter(remote.getOutputStream());
// read the data sent. We basically ignore it,
// stop reading once a blank line is hit. This
// blank line signals the end of the client HTTP
// headers.
String str = ".";
while (!str.equals(""))
str = in.readLine();
// Send the response
// Send the headers
out.println("HTTP/1.0 200 OK");
out.println("Content-Type: text/html");
out.println("Server: Bot");
// this blank line signals the end of the headers
out.println("");
// Send the HTML page
out.println("<H1>Welcome to the Ultra Mini-WebServer</H2>");
out.flush();
remote.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
/**
* Start the application.
*
* @param args
* Command line parameters are not used.
*/
public static void main(String args[]) {
WebServer ws = new WebServer();
ws.start();
}
}
این روی پروت 80 کار میکنه ، یعنی اگر بنویسی : localhost:80 یه کانکشن بین تو و وبسرور ایجاد میشه .
in و out همون فایل های http ی ما هستن ، بعد اون حلقه while هم داره خط به خط اون http رو که مروزگر فرستاده رو میخونه و در نهایت یه پیغامی نشون میده و کانکشن رو میبنده . البته که مثال ساده ایه ...
ممنونم
فقط، اون قسمت دریافت هدر فایل و صفحه رو دقیقا چجوری کار میکنه؟
A.iman
یک شنبه 23 شهریور 1393, 11:30 صبح
خب برو درباره HTTP مطالعه کن و ساختارش رو درک کن . اونجا که داریم روی استریم خروجی چیزایی مینویسیم ، اولش اون هدر فایل رو مینویسیم .
اینجا (http://www.tutorialspoint.com/http/index.htm)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.