PDA

View Full Version : سوال: ساخت مقدمات سرور بدون استفاده از سرولت یا JSP



JAVA_AP
دوشنبه 15 تیر 1388, 14:41 عصر
سلام دوستان!
من برای پروژۀ پایان ترمم مشکل دارم. از شما نمی خوام پروژه رو برام بنویسید، پروژه خیلی خیلی بزرگتر از اینه. من با بقیه ش مشلی ندارم، اما یه تیکه شو اصلاً نمی تونم درست کنم. من هم جاوا بلدم هم چندین ساله چند زبون دیگه کار می کنم و با برنامه نویسی مشکلی ندارم، اما با "برنامه نویسی شبکه ای" چرا. الآن دارم کتاب
Java Network Programming, 3rd Edition By Elliotte Rusty Haroldرو می خونم که احتمالاً مشکلمو حل می کنه. اما کتاب 700 صفحه س و کمی طول می کشه. من هم می ترسم وقت نکنم پروژه م رو انجام بدم چون این تیکه واقعاً تیکه ای کوچیک از پروژه ست و شاید بشه گقت یک پنجاهمش و من با این که سعی می کنم اون کتاب رو کامل بخونم ( الآن صفحۀ 300 ـم ) ولی باز هم می ترسم و از دوستان تقاضای یاری دارم و باز هم می گم باور کنید این پروژۀ ما نیست و پروژه خیلی خیلی بزرگتر از اینه، ولی تا وقتی این تیکه رو انجام ندم نمی تونم به بقیه ش فکر کنم ...

من می خوام بدون استفاده از سرولت یا JSP یا امثالهم، فقط با کمک ServerSocket یه سرور جاوا بسازم که با اجرای اون و رفتن به http://localhost:4400 ، یه صفحۀ HTML نشون داده بشه. فقط همین ! باید یه سری درخواست GET / HTTP1.1
و پاسخ مثل همین رد و بدل بشه. نمی دونید چه کمکی می کنید اگر این رو برای من بنویسید. خواهشاً به جایی هم ارجاع ندید! باور کنید کور شدم انقدر با دستپاچگی اینترنت رو زیرورو کردم !! برای برنامه نویسان حرفه ای فکر نکنم کار مشکلی باشه و شاید 50-60 خط که نصفشم catch ـه بیشتر نشه !

ممنون واقعاً!

JAVA_AP
دوشنبه 15 تیر 1388, 20:02 عصر
مشکل تقریباً حل شد. کد از آقای "علی نادعلی زاده" با اندکی تلخیص :

فایل Server.java


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


public class Server {

public Server() {
try {
ServerSocket serverSocket = new ServerSocket(4444);

while (true) {

Socket newClient = serverSocket.accept();
Workstation w = new Workstation(newClient);
w.start();
}

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

}

public static void main(String[] args) {
new Server();
}

}



کلاس Workstation.java



import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

class Workstation extends Thread {
Socket peer;
DataInputStream dis;
DataOutputStream dos;

public Workstation(Socket newClient) {
peer = newClient;
try {
dis = new DataInputStream(newClient.getInputStream());
dos = new DataOutputStream(newClient.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
try {
PrintStream ps = new PrintStream(dos);
boolean isPOST = false;
String data = "";
String all = "";
// while the client hasn't sent an enter.
while (true) {
data = dis.readLine();
all += data;
System.out.println(data);
if (data.length() == 0)
break;
}

// check the request:

String[] spl = all.split(" ");

if (spl[0].equals("POST"))
isPOST = true;

if (isPOST) {
processPOST(all, ps);
} else {
processGET(all, ps);
}

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

try {
peer.close();
} catch (IOException e) {
e.printStackTrace();
}

}


int getContentLength(String s){
String[] spl = s.split(" ");

return (Integer.parseInt( spl[spl.length-1]));
}

void processPOST(String all, PrintStream ps) throws IOException
{

//Get Content-Length
int content_l = getContentLength(all);
for (int i = 0; i < content_l; i++) {
System.out.print((char)dis.read());
}


}

void processGET(String all, PrintStream ps)
{
ps.println("HTTP/1.1 200 OK");

String[] _Address = all.split(" ");
String Address = _Address[1];

if (Address.equals("/")) {
ps.println("Content-Type: text/html");
ps.println("");
ps.println("<html> <head><title>First Program</title></head> <body> First Program! "
+ "<form method=POST action=/process > <input name=UserName type=text /> <br/>"
+ "<input name=Password type=text /> <br/>"
+ "<input type=submit value=login /> </form> <br/> <a href='http://www.google.com'>Google</a>"
+ " <br/> <a href='process'>process</a> </body> </html>");


} else if (Address.equals("/a.jpg")) {
ps.println("Content-TYpe: image/jpg");
ps.println("");
PrintImage("src/images/Image.png", ps);


} else if (Address.equals("/process")) {
ps.println("Content-Type: text/html");
ps.println("");
ps.println("<html> <head></head> <body> First Program! </body> </html>");
}
}

private void PrintImage(String URL, PrintStream ps) {

FileInputStream fis;
try {
fis = new FileInputStream(URL);
while (fis.available() > 0) {
ps.write(fis.read());
}

} catch (FileNotFoundException e1) {

e1.printStackTrace();
} catch (IOException e) {

e.printStackTrace();
}

}
}

البته باید فایل Image.png در فولدر src/images باشه. هر عکس دیگه ای هم می شه با هر پسوند دیگه ای ( یا حتی فکر کنم هر نوع فایلی ) بجای اون قرار داد.
فایل Server.java رو اجرا کنید و آدرس های زیر رو در مرورگرتون ( بدون نیاز به اتصال به اینترنت ) چک کنید:
http://localhost:4444
http://localhost:4444/a.jpg
http://localhost:4444/process
اما هنوزم چند مشکل: با زدن دکمۀ submit، یه اطلاعاتی فرستاده می شه و آدرس مرورگر می شه http://localhost:4444/process ولی چیزی نشون داده نمی شه. در حالی که اگر خود http://localhost:4444/process رو مستقیم بزنیم اون چیزی که باید نشون داده می شه ؟؟؟ البته مشکل خاصی نیست و با کمی جاوااسکریپت می شه حلش کرد ( فکر کنم ) ، ولی دلیل این که همچین اتفاقی می افته برام عجیبه.