نوشته‌های یک برنامه‌نویس

کمی هم به زبان انسان ها متن بنویسم تا برای کامپیوترها به زبان های خودشان!

نوشته‌های یک برنامه‌نویس

کمی هم به زبان انسان ها متن بنویسم تا برای کامپیوترها به زبان های خودشان!

ساخت یک وب سرور ساده با روبی

چهارشنبه, ۲۰ دی ۱۳۹۱، ۱۲:۲۱ ب.ظ

سلام 

امروز چند قطعه کد جالب در مورد ساخت یک وب سرور همانند IIS ، Apache ، nginx با زبان روبی پیدا کردم.البته نه با قدرت این نرم‌افزارها! بلکه خیلی ساده تر. 

به زودی یک کتاب خوب روبی را آپلود و اگر وقت شد یکم بیشتر در مورد صحبت میکنم.

و حالا کدها با کمی توضیح .... 

  • ساخت وب سروری که تنها به شما Hello World میگوید :-)   (البته در آدرس localhost:2000 و یا IP address: 127.0.0.1:2000)

require "socket"

webserver = TCPServer.new('localhost', 2000)
while (session = webserver.accept)
  session.write(Time.now)
  session.print("Hello World!")
  session.close
end


  • وب سروری که قابلیت نمایش دایرکتوری (فولدر) سرور را نیز دارا میباشد.
ادامه در "ادامه مطلب"

require "socket"

webserver = TCPServer.new('localhost', 2000)
base_dir = Dir.new(".")
while (session = webserver.accept)
  session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
  base_dir.entries.each do |f|
    if File.directory? f
      session.print("
#{f}/

")
    else
      session.print("
#{f}

")
    end
  end
  session.close
end


  • یک وب دایرکتوری با قابلیت جستجو (به معن یاینکه بتوانید وارد فولدر ها زیر مجموعه شوید!)

require "socket"

webserver = TCPServer.new('localhost', 2000)
base_dir = Dir.new(".")
while (session = webserver.accept)
  request = session.gets
  puts request
  trimmedrequest = request.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '').chomp
  resource =  trimmedrequest

  if resource == ""
    resource = "."
  end
  print resource

  if !File.exists?(resource)
    session.print "HTTP/1.1 404/Object Not Found\r\nServer Matteo\r\n\r\n"
    session.close
    next
  end

  if File.directory?(resource)
    session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
    if resource == ""
      base_dir = Dir.new(".")
    else
      base_dir = Dir.new("./#{trimmedrequest}")
    end
    base_dir.entries.each do |f|
      dir_sign = ""
      base_path = resource + "/"
      base_path = "" if resource == ""
      resource_path = base_path + f
      if File.directory?(resource_path)
        dir_sign = "/"
      end
      if f == ".."
        upper_dir = base_path.split("/")[0..-2].join("/")
        session.print("#{f}/")
      else
        session.print("#{f}#{dir_sign}")
      end
    end
  else
     ## return file
  end
  session.close
end


  • و قطعه کد آخر که قابلیت نمایش عکس ها و فایل های ساده را در خود مرورگر فراهم می‌آورد ... 
require "socket"

def get_content_type(path)
    ext = File.extname(path)
    return "text/html"  if ext == ".html" or ext == ".htm"
    return "text/plain" if ext == ".txt"
    return "text/css"   if ext == ".css"
    return "image/jpeg" if ext == ".jpeg" or ext == ".jpg"
    return "image/gif"  if ext == ".gif"
    return "image/bmp"  if ext == ".bmp"
    return "text/plain" if ext == ".rb"
    return "text/xml"   if ext == ".xml"
    return "text/xml"   if ext == ".xsl"
    return "text/html"
end

webserver = TCPServer.new('localhost', 2000)
base_dir = Dir.new(".")
while (session = webserver.accept)
  request = session.gets
  puts request
  trimmedrequest = request.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '').chomp
  resource =  trimmedrequest
  if resource == ""
    resource = "."
  end
  print resource

  if !File.exists?(resource)
    session.print "HTTP/1.1 404/Object Not Found\r\nServer Matteo\r\n\r\n"
    session.print "404 - Resource cannot be found."
    session.close
    next
  end

  if File.directory?(resource)
    session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
    if resource == ""
      base_dir = Dir.new(".")
    else
      base_dir = Dir.new("./#{trimmedrequest}")
    end
    base_dir.entries.each do |f|
      dir_sign = ""
      base_path = resource + "/"
      base_path = "" if resource == ""
      resource_path = base_path + f
      if File.directory?(resource_path)
        dir_sign = "/"
      end
      if f == ".."
        upper_dir = base_path.split("/")[0..-2].join("/")
        session.print("#{f}/")
      else
        session.print("#{f}#{dir_sign}")
      end
    end
  else
    contentType = get_content_type(resource)
    session.print "HTTP/1.1 200/OK\r\nServer: Matteo\r\nContent-type: #{contentType}\r\n\r\n"
    File.open(resource, "rb") do |f|
      while (!f.eof?) do
        buffer = f.read(256)
        session.write(buffer)
      end
    end
  end
  session.close
end


البته خودم دوست نداشتم از وبلاگ های خارجی کپی پیست کنم ولی خب قطعه کد جالبی بود.
موفق باشد
  • چهارشنبه, ۲۰ دی ۱۳۹۱، ۱۲:۲۱ ب.ظ
  • علی غفاری

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی