Sujet n°10348
Posté par Nuri Yuri le 3 Sep - 16:23 (2011)
Titre : Web_File v2
Bonjour, je vais vous présenter une Amélioration de mon script Web_File.

Qu'est-ce qu'est Web_File ?

Web_File est un script permettant d'avoir une communication minimale avec le serveur Apaches (serveur web) pour interagir avec un script ou télécharger des fichiers par exemple. Grâce à ce script vous pouvez donc mettre à jour vos jeu en téléchargeant le fichier In-Game ou coder un script permettant de faire fonctionner votre jeu Online en utilisant un serveur Apache et des scripts PHP pour les communications. (Lorsque vous ne pouvez pas avoir de serveur dédié.)

Les scripts et fichiers

Web_File aura besoins d'une DLL du script Socket et d'une initialisation de certaines APIs, attention le script Socket fournis contient des méthodes modifié et des méthodes ajouté donc il peut être incompatible avec ses versions précédentes.
Script API

Code:

#===
#¤Module API
#---
#%Contient toute les constantes D'apis que les script
#%pourraient appeler.
#---
#© 14/05/2011 - Nuri Yuri (塗 ゆり)
#& 28/05/2011 - Nuri Yuri (塗 ゆり) : Ajout de WPPS
#===
module API
  begin
    #===
    #Initialisation des nom de DLL
    #===
    Yuri_DLL="Yuri_API.dll"
    #===
    #Initialisation des constante
    #%Déclarez toute vos API ICI !
    #===
    INI_WS=Win32API.new(Yuri_DLL,"init_winsock","","i")
    CLN_WS=Win32API.new(Yuri_DLL,"clean_winsock","","i")
    SCK_RD=Win32API.new(Yuri_DLL,"socket_read","pipipii","p")
    TCP_serv_online=Win32API.new(Yuri_DLL,"TCPSocket_server_online","pi","i")
    TCP_serv_exist=Win32API.new(Yuri_DLL,"TCPSocket_server_exist","p","i")
  rescue
    print("Erreur dans le script API :\n",$!.message,"\nIl se peut que ce soit un problème de chargement d'une API")
    exit(-1)
  end
end

Script Socket

Code:
#==========================================#
#¤Script de gestion de Socket              #
#------------------------------------------#
#©Ruby
#==========================================#
module Win32
  Rtl_Move_MEM=Win32API.new("kernel32", "RtlMoveMemory", "ppl", "")
  def copymem(len)
    buf = "\0" * len
    Rtl_Move_MEM.call(buf, self, len)
    buf
  end
end
class Numeric
  include Win32
end
class String
  include Win32
end

module Winsock
  DLL = "ws2_32"
  A_ACCEPT=Win32API.new(DLL, "accept", "ppl", "l")
  A_BLIND=Win32API.new(DLL, "bind", "ppl", "l")
  A_CLOSE_S=Win32API.new(DLL, "closesocket", "p", "l")
  A_CONNECT=Win32API.new(DLL, "connect", "ppl", "l")
  A_GHBADD=Win32API.new(DLL, "gethostbyaddr", "pll", "l")
  A_GHBNAME=Win32API.new(DLL, "gethostbyname", "p", "l")
  A_GHNAME=Win32API.new(DLL, "gethostname", "pl", "")
  A_GSBNAME=Win32API.new(DLL, "getservbyname", "pp", "p")
  A_HTONL=Win32API.new(DLL, "htonl", "l", "l")
  A_HTONS=Win32API.new(DLL, "htons", "l", "l")
  A_INET_ADD=Win32API.new(DLL, "inet_addr", "p", "l")
  A_INET_NTOA=Win32API.new(DLL, "inet_ntoa", "l", "p")
  A_LISTEN=Win32API.new(DLL, "listen", "pl", "l")
  A_RECV=Win32API.new(DLL, "recv", "ppll", "l")
  A_SELECT=Win32API.new(DLL, "select", "lpppp", "l")
  A_SEND=Win32API.new(DLL, "send", "ppll", "l")
  A_SSOPT=Win32API.new(DLL, "setsockopt", "pllpl", "l")
  A_SHUT_DOWN=Win32API.new(DLL, "shutdown", "pl", "l")
  A_SOCKET=Win32API.new(DLL, "socket", "lll", "l")
  A_LAST_ERR=Win32API.new(DLL, "WSAGetLastError", "", "l")
  def self.accept(*args)
    A_ACCEPT.call(*args)
  end
  def self.bind(*args)
    A_BLIND.call(*args)
  end
  def self.closesocket(*args)
    A_CLOSE_S.call(*args)
  end   
  def self.connect(*args)
    A_CONNECT.call(*args)
  end       
  def self.gethostbyaddr(*args)
    A_GHBADD.call(*args)
  end
  def self.gethostbyname(*args)
    A_GHBNAME.call(*args)
  end
  def self.gethostname(*args)
    A_GHNAME.call(*args)
  end
  def self.getservbyname(*args)
    A_GSBNAME.call(*args)
  end
  def self.htonl(*args)
    A_HTONL.call(*args)
  end
  def self.htons(*args)
    A_HTONS.call(*args)
  end
  def self.inet_addr(*args)
    A_INET_ADD.call(*args)
  end
  def self.inet_ntoa(*args)
    A_INET_NTOA.call(*args)
  end   
  def self.listen(*args)
    A_LISTEN.call(*args)
  end
  def self.recv(*args)
    A_RECV.call(*args)
  end
  def self.select(*args)
    A_SELECT.call(*args)
  end
  def self.send(*args)
    A_SEND.call(*args)
  end
  def self.setsockopt(*args)
    A_SSOPT.call(*args)
  end   
  def self.shutdown(*args)
    A_SHUT_DOWN.call(*args)
  end
  def self.socket(*args)
    A_SOCKET.call(*args)   
  end
  def self.WSAGetLastError(*args)
    A_LAST_ERR.call(*args)
  end
end
class Socket
  attr_accessor :recv_size
  API_WRITE=Win32API.new("msvcrt", "_write", "lpl", "l")
  AF_UNSPEC = 0   
  AF_UNIX = 1
  AF_INET = 2
  AF_IPX = 6
  AF_APPLETALK = 16
  PF_UNSPEC = 0   
  PF_UNIX = 1
  PF_INET = 2
  PF_IPX = 6
  PF_APPLETALK = 16
  SOCK_STREAM = 1
  SOCK_DGRAM = 2
  SOCK_RAW = 3
  SOCK_RDM = 4
  SOCK_SEQPACKET = 5
  IPPROTO_IP = 0
  IPPROTO_ICMP = 1
  IPPROTO_IGMP = 2
  IPPROTO_GGP = 3
  IPPROTO_TCP = 6
  IPPROTO_PUP = 12
  IPPROTO_UDP = 17
  IPPROTO_IDP = 22
  IPPROTO_ND = 77
  IPPROTO_RAW = 255
  IPPROTO_MAX = 256
  SOL_SOCKET = 65535
  SO_DEBUG = 1
  SO_REUSEADDR = 4
  SO_KEEPALIVE = 8
  SO_DONTROUTE = 16
  SO_BROADCAST = 32
  SO_LINGER = 128
  SO_OOBINLINE = 256
  SO_RCVLOWAT = 4100
  SO_SNDTIMEO = 4101
  SO_RCVTIMEO = 4102
  SO_ERROR = 4103
  SO_TYPE = 4104
  SO_SNDBUF = 4097
  SO_RCVBUF = 4098
  SO_SNDLOWAT = 4099
  TCP_NODELAY = 1
  MSG_OOB = 1
  MSG_PEEK = 2
  MSG_DONTROUTE = 4
  IP_OPTIONS = 1
  IP_DEFAULT_MULTICAST_LOOP = 1
  IP_DEFAULT_MULTICAST_TTL   = 1
  IP_MULTICAST_IF = 2
  IP_MULTICAST_TTL = 3
  IP_MULTICAST_LOOP = 4
  IP_ADD_MEMBERSHIP = 5
  IP_DROP_MEMBERSHIP = 6
  IP_TTL = 7
  IP_TOS = 8
  IP_MAX_MEMBERSHIPS = 20
  EAI_ADDRFAMILY = 1
  EAI_AGAIN = 2
  EAI_BADFLAGS = 3
  EAI_FAIL = 4
  EAI_FAMILY = 5
  EAI_MEMORY = 6
  EAI_NODATA = 7
  EAI_NONAME = 8
  EAI_SERVICE = 9
  EAI_SOCKTYPE = 10
  EAI_SYSTEM = 11
  EAI_BADHINTS = 12
  EAI_PROTOCOL = 13
  EAI_MAX = 14
  AI_PASSIVE = 1
  AI_CANONNAME = 2
  AI_NUMERICHOST = 4
  AI_MASK = 7
  AI_ALL = 256
  AI_V4MAPPED_CFG = 512
  AI_ADDRCONFIG = 1024
  AI_DEFAULT = 1536
  AI_V4MAPPED = 2048   
  attr_accessor :recv_size
  def self.getaddress(host)
    gethostbyname(host)[3].unpack("C4").join(".")
  end 
  def self.getservice(serv)
    case serv
    when Numeric
      return serv
    when String
      return getservbyname(serv)
    else
      raise "Please us an interger or string for services."
    end
  end
  def self.gethostbyname(name)
    raise SocketError::ENOASSOCHOST if (ptr = Winsock.gethostbyname(name)) == 0
    host = ptr.copymem(16).unpack("iissi")
    [host[0].copymem(64).split("\0")[0], [], host[2], host[4].copymem(4).unpack("l")[0].copymem(4)]
  end
  def self.gethostname
    buf = "\0" * 256
    Winsock.gethostname(buf, 256)
    buf.strip
  end
  def self.getservbyname(name)
    case name
    when /echo/i
      return 7
    when /daytime/i
      return 13
    when /ftp/i
      return 21
    when /telnet/i
      return 23
    when /smtp/i
      return 25
    when /time/i
      return 37
    when /http/i
      return 80
    when /pop/i
      return 110
    else
      raise "Service not recognized."
    end
  end 
  def self.sockaddr_in(port, host)
    begin
      [AF_INET, getservice(port)].pack("sn") + gethostbyname(host)[3] + [].pack("x8")
    rescue
      nil
    end
  end
  def self.open(*args)
    socket = new(*args)
    if block_given?
      begin
          yield socket
      ensure
          socket.close
      end
    end
    nil
  end 
  def initialize(domain, type, protocol)
    SocketError.check if (@fd = Winsock.socket(domain, type, protocol)) == -1
    @fd
  end
  def accept(flags = 0)
    buf = "\0" * 16
    SocketError.check if Winsock.accept(@fd, buf, flags) == -1
    buf
  end
  def bind(sockaddr)
    SocketError.check if (ret = Winsock.bind(@fd, sockaddr, sockaddr.size)) == -1
    ret
  end   
  def close
    SocketError.check if (ret = Winsock.closesocket(@fd)) == -1
    ret
  end 
  def connect(sockaddr)
    ret = Winsock.connect(@fd, sockaddr, sockaddr.size)
    SocketError.check if ret == -1
    ret
  end
  def listen(backlog)
    SocketError.check if (ret = Winsock.listen(@fd, backlog)) == -1
    ret
  end   
  def select(timeout)
    SocketError.check if (ret = Winsock.select(1, [1, @fd].pack("ll"), 0, 0, [timeout, timeout * 1000000].pack("ll"))) == -1
    ret
  end
  def ready?
    not select(0) == 0
  end   
  def read(len)
    buf = "\0" * len
    Win32API.new("msvcrt", "_read", "lpl", "l").call(@fd, buf, len)
    buf
  end 
  def recv(len, flags = 0)
    buf = "\0" * len
    SocketError.check if (@recv_size=Winsock.recv(@fd, buf, buf.size, flags)) == -1
    buf[0,@recv_size]
  end
  def send(data, flags = 0)
    SocketError.check if (ret = Winsock.send(@fd, data, data.size, flags)) == -1
    ret
  end
  alias write send
  def gets
    # Create buffer
    buffer = ""
    # Loop Until "end of line"
    cm=false
    while ((char = recv(1)) != "\n" and not cm)
      if char == "\r"
        cm=true
      else
        buffer += char
      end
    end
    # Return recieved data
    return buffer
  end
end
class TCPSocket < Socket 
  def self.open(*args)
    socket = new(*args)
    if block_given?
      begin
        yield socket
      ensure
        socket.close
      end
    end
    nil
  end 
  def initialize(host, port)
    super(AF_INET, SOCK_STREAM, IPPROTO_TCP)
    connect(Socket.sockaddr_in(port, host))
  end
  #Ajouts
  def self.server_online?(host, port)
    a=API::TCP_serv_online.call(host.to_s,port.to_i)
    if a==-1
      return nil
    elsif a==0
      return false
    elsif a==1
      return true
    end
  end
 
  def self.server_exist?(host)
    a=API::TCP_serv_exist.call(host.to_s)
    if a==0
      return false
    elsif a==1
      return true
    end
  end
end
class SocketError < StandardError
  ENOASSOCHOST = "getaddrinfo: no address associated with hostname."
  def self.check
    errno = Winsock.WSAGetLastError
    errno = Errno.constants.detect { |c| Errno.const_get(c).new.errno == errno }
    if errno != nil
      $socket_error=Errno.const_get(errno)
    end
  end
end

Script Web_File

Code:
#==========================================#
#¤Script de communication minimal avec     #
# les serveurs Apache. (v 1.9)             #
#------------------------------------------#
#©Mangeuse de cannes - Modifié pour PSP v2              #
#==========================================#
class Web_File
  S_Nil=""
  S_Et="&"
  S_Eq="="
  S_RNRN="\r\n\r\n"
  S_RN="\r\n"
  S_dp=": "
  S_St="Status"
  S_sp=" "
  Err_OD="Erreur : Online désativé"
  Err_ITS="Erreur : impossible de trouver le Serveur !"
  Err_ICS="Erreur : impossible de se connecter au Serveur !"
  Err_NDT="Erreur : Aucune réponse..."
  H_Connection="Connection"
  H_XConnection="X-Cnection"
  H_size="Content-Length"
  V_Close="close"
  RE_Size=2048
  attr_accessor :url, :host, :data, :variables,:socket,:size,:dlsize,:closed,:header
  #===
  #§ Initialize
  #---
  #host : DNS du serveur
  #url : url de l'objet ex : "index.php", "/images/pic.png"
  #variables : Toutes les variables envoyé lors de la co
  #  ex : {"nombre" => "6", "string" => "chaine", "fichier" => "/index.php" ...}
  #===
  def initialize(host1,url1,variables={})
    @url=url1.to_s
    @host=host1.to_s
    @data=S_Nil
    @variables=variables
    @header={}
    @socket=false
    @size=0
    @dlsize=0
    @closed=true #Si ça été fermé.
  end
  #===
  #§ Lancement
  #===
  def run(post=true)
    unless $online
      print(Err_OD)
      return -1
    end
    #Ouverture de la soccket...
    @socket=TCPSocket.new(@host,80)
    #Création du data de réception
    @data=""
    #Création du buffer d'envois
    unless post
      send_buf="GET /#{@url}#{make_var(true)} HTTP/1.1\r\nHost: #{@host}\r\nConnection: Close\r\n\r\n"
    else
      post=make_var
      send_buf="POST /#{@url} HTTP/1.1\r\nHost: #{@host}\r\nConnection: Close\r\nContent-type: application/x-www-form-urlencoded; charset=utf-8\r\nContent-Length: #{post.size}\r\n\r\n#{post}"
    end
    @closed=false
    #Envois de la requette.
    @socket.send(send_buf)
    #Récupération des infos...
    tmp_data=@socket.recv(RE_Size*2)
    if tmp_data==S_Nil or !tmp_data
      print(Err_NDT)
      return 3
    end
    end_header=tmp_data.index(S_RNRN)+4
    get_header(tmp_data[0,end_header-4])
    @data << tmp_data[end_header,tmp_data.size-end_header]
    #Verification de la taille
    unless @header[H_size]
      @size=@data.size+1
      @dlsize=@size
    else
      @size=@header[H_size].to_i
      @header[H_size]=@size  #Conversion
      @dlsize=@data.size
    end
    if @dlsize >= @size
      @closed=true
      @socket.close
      return 4
    end
    return 0
  end
  #===
  #§ Mise à jour du DL
  #===
  def update(autoclose=true)
    #Reception
    tmp_data=@socket.recv(RE_Size)
    #Si data vide (considéré comme socket fermé)
    if tmp_data==S_Nil or !tmp_data
      if autoclose
        @closed=true
        @socket.close
      end
      return 3
    end
    @dlsize+=tmp_data.size #Mise à jour de la taille DL
    @data << tmp_data  #Ajout du data
    #Verification de la taille si >= fermeture
    if @dlsize >= @size
      @closed=true
      @socket.close
      return 2
    end
    return 0
  end
  #===
  #§ Get header
  #% Capture toute les données envoyé dans les header.
  #===
  def get_header(header_str)
    @header.clear
    header_arr=header_str.split(S_RN)
    #Verification de la première requette
    st=header_arr[0].split(S_sp)
    @header[S_St]=st[2].to_s
    @header[0]=st[1].to_i
    #Traitement du reste
    for i in 1...header_arr.length
      arr=header_arr[i].split(S_dp)
      @header[arr[0].to_s]=arr[1].to_s
    end
  end
  #===
  #§Encodage des données pour le serveur
  #% L'encodage est peut être incomplet
  #===
  def get_to_httpget(var)
    var.gsub("%","%25").gsub("$","%24").gsub("+","%2B").gsub(",","%2C").gsub("\"","%22").gsub("<","%3C").gsub(">","%3E").gsub("{","%7B").gsub("}","%7D").gsub("|","%7C").gsub("\\","%5C").gsub("^","%5E").gsub("~","%7E").gsub("[","%5B").gsub("]","%5D").gsub("`","%60").gsub(" ","%20")
  end
  def post_to_httppost(var)
    var.gsub!("%","%25") 
    var.gsub!("+","%2B") 
    var.gsub!(" ", "+") 
    var.gsub!("!", "%21") 
    var.gsub!("\"", "%22") 
    var.gsub!("#", "%23") 
    var.gsub!("$", "%24") 
    var.gsub!("&", "%26") 
    var.gsub!("'", "%27") 
    var.gsub!("(", "%28") 
    var.gsub!(")", "%29") 
    var.gsub!("*", "%2A") 
    var.gsub!(",", "%2C") 
    var.gsub!("/", "%2F") 
    var.gsub!(":", "%3A") 
    var.gsub!(";", "%3B") 
    var.gsub!("<", "%3C") 
    var.gsub!("=", "%3D") 
    var.gsub!(">", "%3E") 
    var.gsub!("?", "%3F") 
    var.gsub!("@", "%40") 
    var.gsub!("[", "%5B") 
    var.gsub!("\\", "%5C") 
    var.gsub!("]", "%5D") 
    var.gsub!("^", "%5E") 
    var.gsub!("`", "%60") 
    var.gsub!("{", "%7B") 
    var.gsub!("|", "%7C") 
    var.gsub!("}", "%7D") 
    var.gsub!("~", "%7E") 
    var.gsub!("€", "%80") 
    var.gsub!("", "%81") 
    var.gsub!("‚", "%82") 
    var.gsub!("„", "%84") 
    var.gsub!("…", "%85") 
    var.gsub!("†", "%86") 
    var.gsub!("‡", "%87") 
    var.gsub!("ˆ", "%88") 
    var.gsub!("‰", "%89") 
    var.gsub!("Š", "%8A") 
    var.gsub!("‹", "%8B") 
    var.gsub!("Œ", "%8C") 
    var.gsub!("Ž", "%8E") 
    var.gsub!("‘", "%91") 
    var.gsub!("’", "%92") 
    var.gsub!("“", "%93") 
    var.gsub!("”", "%94") 
    var.gsub!("•", "%95") 
    var.gsub!("–", "%96") 
    var.gsub!("—", "%97") 
    var.gsub!("˜", "%98") 
    var.gsub!("™", "%99") 
    var.gsub!("š", "%9A") 
    var.gsub!("›", "%9B") 
    var.gsub!("œ", "%9C") 
    var.gsub!("ž", "%9E") 
    var.gsub!("Ÿ", "%9F") 
    var.gsub!("¡", "%A1") 
    var.gsub!("¢", "%A2") 
    var.gsub!("£", "%A3") 
    var.gsub!("¤", "%A4") 
    var.gsub!("¥", "%A5") 
    var.gsub!("¦", "%A6") 
    var.gsub!("§", "%A7") 
    var.gsub!("¨", "%A8") 
    var.gsub!("©", "%A9") 
    var.gsub!("ª", "%AA") 
    var.gsub!("«", "%AB") 
    var.gsub!("¬", "%AC") 
    var.gsub!("­", "%AD") 
    var.gsub!("®", "%AE") 
    var.gsub!("¯", "%AF") 
    var.gsub!("°", "%B0") 
    var.gsub!("±", "%B1") 
    var.gsub!("²", "%B2") 
    var.gsub!("³", "%B3") 
    var.gsub!("´", "%B4") 
    var.gsub!("µ", "%B5") 
    var.gsub!("¶", "%B6") 
    var.gsub!("·", "%B7") 
    var.gsub!("¸", "%B8") 
    var.gsub!("¹", "%B9") 
    var.gsub!("º", "%BA") 
    var.gsub!("»", "%BB") 
    var.gsub!("¼", "%BC") 
    var.gsub!("½", "%BD") 
    var.gsub!("¾", "%BE") 
    var.gsub!("¿", "%BF") 
    var.gsub!("À", "%C0") 
    var.gsub!("Á", "%C1") 
    var.gsub!("Â", "%C2") 
    var.gsub!("Ã", "%C3") 
    var.gsub!("Ä", "%C4") 
    var.gsub!("Å", "%C5") 
    var.gsub!("Æ", "%C6") 
    var.gsub!("Ç", "%C7") 
    var.gsub!("È", "%C8") 
    var.gsub!("É", "%C9") 
    var.gsub!("Ê", "%CA") 
    var.gsub!("Ë", "%CB") 
    var.gsub!("Ì", "%CC") 
    var.gsub!("Í", "%CD") 
    var.gsub!("Î", "%CE") 
    var.gsub!("Ï", "%CF") 
    var.gsub!("Ð", "%D0") 
    var.gsub!("Ñ", "%D1") 
    var.gsub!("Ò", "%D2") 
    var.gsub!("Ó", "%D3") 
    var.gsub!("Ô", "%D4") 
    var.gsub!("Õ", "%D5") 
    var.gsub!("Ö", "%D6") 
    var.gsub!("×", "%D7") 
    var.gsub!("Ø", "%D8") 
    var.gsub!("Ù", "%D9") 
    var.gsub!("Ú", "%DA") 
    var.gsub!("Û", "%DB") 
    var.gsub!("Ü", "%DC") 
    var.gsub!("Ý", "%DD") 
    var.gsub!("Þ", "%DE") 
    var.gsub!("ß", "%DF") 
    var.gsub!("à", "%E0") 
    var.gsub!("á", "%E1") 
    var.gsub!("â", "%E2") 
    var.gsub!("ã", "%E3") 
    var.gsub!("ä", "%E4") 
    var.gsub!("å", "%E5") 
    var.gsub!("æ", "%E6") 
    var.gsub!("ç", "%E7") 
    var.gsub!("è", "%E8") 
    var.gsub!("ê", "%EA") 
    var.gsub!("ë", "%EB") 
    var.gsub!("ì", "%EC") 
    var.gsub!("í", "%ED") 
    var.gsub!("î", "%EE") 
    var.gsub!("ï", "%EF") 
    var.gsub!("ð", "%F0") 
    var.gsub!("ñ", "%F1") 
    var.gsub!("ò", "%F2") 
    var.gsub!("ó", "%F3") 
    var.gsub!("ô", "%F4") 
    var.gsub!("õ", "%F5") 
    var.gsub!("ö", "%F6") 
    var.gsub!("÷", "%F7") 
    var.gsub!("ø", "%F8") 
    var.gsub!("ù", "%F9") 
    var.gsub!("ú", "%FA") 
    var.gsub!("û", "%FB") 
    var.gsub!("ü", "%FC") 
    var.gsub!("ý", "%FD") 
    var.gsub!("þ", "%FE") 
    var
  end
  #===
  #§création de la requete contenant les variables
  #===
  def make_var(get=false)
    return S_Nil if @variables.keys.size==0
    #Création du data
    if get
      data="?"
    else
      data=""
    end
    #Si c'est la première variable
    first=true
    #Ajout des variables dans le data.
    for i in @variables.keys
      unless first
        data << S_Et
      else
        first=false
      end
      data << i.to_s << S_Eq << (get ? get_to_httpget(@variables[i].to_s) : post_to_httppost(@variables[i].to_s))
    end
    return data
  end
end

Lien vers la DLL :
Megaupload : Lien (25 secondes si vous avez un compte MU, dans le cas contraire 45 secondes.)

Utilisation

Pour créer un objet Web_File il faut faire :
Code:
variable = Web_File.new("nom du serveur","url du fichier",{"variables" => "valeur"})
Le nom du serveur est l'host google.com par exemple, il ne faut surtout pas mettre de HTTP:// dedans.
L'url est l'url du fichier avec lequel Web_File va faire les transactions, le "/" début n'est pas à mettre.
Les variables sont optionnelles, c'est les variables qui seront envoyé au serveur lorsque vous lancerais une transaction.
Vous pouvez donc initialiser de cette façon :
Code:
variable = Web_File.new("nom du serveur","url du fichier")

Pour lancer une transaction il suffit de faire :
Code:
variable.run(bool)
Le bool doit être true pour faire un transaction POST et false pour une transaction GET, par défauts c'est de transaction POST.
Cette méthode retourne les valeurs suivantes :
-1 : Variable $online désactivé donc communication interdites.
3 : Le serveur n'a pas répondu ou a envoyé un buffer vide.
4 : Le téléchargement du fichier est fini ou le serveur n'a pas fourni d'informations sur la taille... Dans ce cas la socket est fermé.
0 : Tout s'est bien passé, il faudra finir de télécharger le fichier.

Pour continuer le téléchargement il faut faire :
Code:
variable.update

Cette méthode retourne :
3 : Dernier buffer Vide, socket fermé si le paramètre été true (paramètre par défauts.)
2 : Téléchargement fini.
0 : Tout s'est bien passé, téléchargement à finir.

Cette classe a des variables modifiables qui sont :
Code:
variable.url #Url du fichier de communication
variable.host #Nom du serveur
variable.data #Data complet reçus.
variable.variables #Hash des variables qui sont envoyé, si vous voulez en changer ex variable.variables["user"]="Yuri"
variable.size #Taille du fichier donné par le serveur.
variable.dlsize #Taille téléchargé du fichier <= variables.data.size
variable.closed #Si la socket est fermé donc qu'un téléchargement est fini ou qu'il n'y en a pas encore eu
variable.header #Header donné par le serveur.


Conseil

Lorsque vous faites un jeu online en utilisant Web_File, il est conseillé de ne pas faire de communications toute les frames mais plutot toute les secondes vois 5 secondes pour pas surcharger le serveur et faire du bien aux scripts...
Il est conseillé pour que TCPSocket fonctionne correctement de mettre dans les premiers Scripts :
API::INI_WS.call
et mettre $online=true si vous voulez que le online soit toujours activé.
Puis si vous n'êtes pas un porc, mettre à la fin de Main :
API::CLN_WS.call

Crédits

塗 ゆり Codage de la DLL, codage de la classe Web_File, recherche de la classe TCPSocket sur google.
La classe TCPSocket trouvé n’avait que pour crédits Ruby.

Posté par Tinei le 3 Sep - 17:20 (2011)
Cool ! Merci beaucoup !

Posté par og_loc-TATOO le 5 Sep - 16:36 (2011)
Juste une question, ce script permet-il de coder pendant le jeu ?

(ça me serait d'une très grande utilité) Imbécile heureux

Posté par Nuri Yuri le 5 Sep - 16:40 (2011)
Bah, si t'as une page PHP qui te chie un jolis code ruby et que tu l’exécute après l'avoir récupérer oui.

Posté par Portoss_01 le 21 Déc - 00:06 (2013)
En gros ce script permet de faire un jeu online?

Posté par Nuri Yuri le 21 Déc - 00:33 (2013)
Non, il permet de charger des pages web en leur envoyant des données.

Posté par Overheat45 le 21 Déc - 07:27 (2013)
Je croie que j'ai très bien compris mais, ce script permettrais-t-il de faire des choses comme le cadeau mystère.

Posté par TouzaxA le 21 Déc - 07:47 (2013)
Overheat45 a écrit:
Je croie que j'ai très bien compris mais, ce script permettrais-t-il de faire des choses comme le cadeau mystère.


Théoriquement, c'est un peu le principe.

Posté par Nuri Yuri le 21 Déc - 09:17 (2013)
En effet, on peut utiliser ce script dans ce but précis.

Posté par Overheat45 le 2 Jan - 05:34 (2014)
Ok. Merci. (Et désolé si j'ai mis du temps à répondre).

Posté par Zohran le 21 Juil - 20:30 (2014)
Salut Yuri, merci beaucoup pour ce script, je sens qu'il pourrait m'être sacrément utile !
Pourrais-tu réuploader le fichier DLL svp?

Posté par Nuri Yuri le 21 Juil - 21:57 (2014)
._.
Nan, j'ai formaté mon PC une floppé de fois entre temps, faudra adapter les scripts.

Posté par Zohran le 22 Juil - 15:41 (2014)
Arf !
Faudra adapter les scripts? Mais sans DLL, c'est pas possible ._. Nan?

Posté par Nuri Yuri le 22 Juil - 15:43 (2014)
Tu supprime toutes les lignes qui utilise la DLL ça devrait fonctionner. Je te conseille de bien regarder quand même :p
La DLL servait à initialiser Winshock et vérifier si un serveur était dispo. Si tu utilises RGSS104E.dll t'as pas besoins.

Posté par Otruch le 23 Aoû - 19:30 (2014)
Finalement je vais utiliser TCP socket, le script et la DLL pour reproduire le protocole Websocket.

J'ai de la lecture à faire pour étudier ça, mais c'est largement moins du sucide que faire sa propre DLL Websocket en utilisant Win32API.

Posté par Nuri Yuri le 23 Aoû - 19:48 (2014)
Fais attention aux Script is Hanging. La version full Ruby de TCPSocket ne gère pas bien les temps de connexion.