ใช้ Java + socket ปลอมตัวเป็น web server


server ทำงานง่ายๆ แค่มี socket เปิด port ไว้
client ในที่นี้ก็คือ Browser จะมีการ request ที่จะบอกลักษณะของการ request มาตามข้อตกลง
จริงๆ ก็คือการส่ง write socket ไปที่ address ที่กำหนดนั่นแหละ

ตัวอย่างคือ เราเปิด browser ไปที่ 127.0.0.1:8901/
ก็คือการเปิด socket ไปที่ port 8901 ของเครื่อง 127.0.0.1
ถ้าเกิดว่า application ที่เปิดอยู่ที่ port นี้ตอบคำถามของ browser ได้
มันก็คือ web server แล้วนั่นเอง

ส่ิงที่เราต้องเข้าใจคือการตอบคำถามของ Browser ที่จะมีสองส่วนคือ
ส่วนที่บอกว่า message ที่เราส่งกลับคือ HTTP นะ (HTTP header)

"HTTP/1.0 200 OK\r\n" +
"Content-Type: text/html\r\n" +
"Date: " + new Date() + "\r\n" +
"Server: FileServer 1.0\r\n\r\n" // \r\n ตัวหลังคือจบส่วนของ Header 

และส่วนของเนื้อหา(content) อาจจะเป็นได้ทั้ง html และ ไฟล์ภาพทั้งหลาย
ในที่นี้สร้าง html ง่ายๆ ฝังไปก่อน

private String html(){
    StringBuilder html = new StringBuilder(""
            + "<!DOCTYPE HTML>"
            + "<html lang='en'>"
            + "<head>"
            + "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"
            + "<title>Form</title>"
            + "<meta name='author' content='Moss Mahidol'>"
            + "<!-- Date: 2011-06-28 -->"
            + "</head>"
            + "<body>"
            + "<h1>It work!</h1>"
            + "</body>"
            + "</html>");
    return html.toString();
}

ในที่นี้ผม ให้ Thread ConnectionHandler ลูกของ Server ที่เป็น Runnable
มารับ Connection ของ Client(ฺBrowser) แต่ละตัวแทนนะครับ

Socket connection = listenSocket.accept();
new ConnectionHandler(connection);

และนี่คือตัวอย่างของ method run ของ ConnectionHandler นะครับ
assume ว่า สร้าง socket connection กันได้ตั้งแต่ Server แล้วนะครับ

public void run() {
    display("Connection request received");
    try {
        outStream = socket.getOutputStream();
        outDataStream = new PrintStream(
                new BufferedOutputStream(outStream));
        inStream = socket.getInputStream();
        in = new BufferedReader(
                new InputStreamReader(inStream));
        String request = in.readLine();
        while (request != null) {
             display(request);
             request = in.readLine();
             if(request.trim().equals("")) {
                 break;
             }
        }
        if (request == null) {
             display("request is null");
        }
        outDataStream.print("HTTP/1.0 200 OK\r\n" +
                            "Content-Type: " + "text/html" + "\r\n" +
                            "Date: " + new Date() + "\r\n" +
                            "Server: FileServer 1.0\r\n\r\n");
        outDataStream.print(html());

        outDataStream.close();
        inStream.close();
        outStream.flush();
        outStream.close();
        socket.close();
        display("bye client.");
    } catch (IOException e) {
        display(e.toString());
    }
}

ปอลิง. display() คือ System out ธรรมดา!
ปอลิง2. ตัวแปลที่ไม่ประกาศคือประกาศไว้ข้างนอกแล้ว

ตัวอย่างผล

Advertisements

7 thoughts on “ใช้ Java + socket ปลอมตัวเป็น web server

  1. เฮ้ย!! index.php มาไง!

    จริงๆ แล้วมันคือ request คนละครั้งกันกับที่ browser โชว์อยู่ – -‘ โทษทีที่ถ่ายรูปพลาดครับ

    • อันนี้ให้เห็นการทำงานเบื้องหลังมากกว่าครับ HttpServer นี่คือจัดการเรื่องพวกนี้ให้เสร็จ(แถมน่าจะดีกว่านะครับ)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s