使用Ruby進行文件分發之客戶端構建

代碼原理很簡單,就是客戶端與服務器創建鏈接,而後進行數據的傳輸,若是要說有難點的地方的估計也就是一些文件處理方式上,下面就是代碼:服務器

客戶端:less

客戶端中使用加載socket庫,我這裏用的是tcpsocket,向服務器發送數據的方法則採用了puts,另外就是客戶端有個將服務器傳送過來的16進制數據進行解析的函數,我這裏客戶端和服務器採用十六進制進行數據的傳輸,相比較而言,速度仍是比較快 的。socket

客戶端的操做流程是這樣的,開啓客戶端,在配置文件中輸入將要鏈接的服務器端ip以及端口號,而後運行客戶端就能夠了,其中客戶端涉及到兩個類,一個就是更新文件的操做,另外一個就是讀寫配置文件的操做,client類中,主要的函數就是更新文件操做,其中有一個就是逆解析16進制文件,將其轉換成普通的可正常閱讀的文件;INIReader類中是對ini文件進行解析的操做。主要就是解析ini文件中的節點。客戶端寫起來仍是比較順利的,在ini文件解析的地方一開始浪費了很多腦細胞。tcp

另外:在作的過程當中若是你不想關閉客戶端,只要將斷開鏈接的操做改掉就能夠了。函數

若是使用ocra進行到包操做,在打包成exe的過程當中,若是有死循環能夠在循環處增長一個ui

unless defined? Ocraspa

         while 1server

                   my_methodip

         endget

end

便可。

下面是源碼:

require 'socket'
require 'fileutils'
class Client
def initialize(host,port)

$client=TCPSocket.open(host,port)

end
def update_file
p 'start to update'
#record the server send info
line=$client.gets.chop
filename_arr=[]
p line
#get the file name
if line=='1'
directory_name=$client.gets.chop
p directory_name
filename=$client.gets.chop
filename.split('|').each {|x| filename_arr<<x}
p filename_arr

if not File.exists?(directory_name)
Dir.mkdir(directory_name)
else
for i in 0..filename_arr.size-1
p filename_arr[i]
f=File.new(directory_name+filename_arr[i],'w')
end
end
line=$client.gets.chop
end
#get the filebody
if line=='2'
p line

for i in 0..filename_arr.size-1
filebodyArr=[]
filebody=$client.gets.chop
p filebody
chars=filebody.scan(/../).to_a
chars.each{|ch|filebodyArr<<ch if not (ch=="[\"" or ch=="\"]") }
fout=File.open(directory_name+filename_arr[i],'wb')
filebodyArr.each{|f| fout.write f.to_i(16).chr}
fout.close
end
line=$client.gets.chop
end
if line=='Over'
p "it's over"
end
if line=='There is no update'
p 'There is no update'
end
 
end
end
#host='localhost'
#port=3000


#parser the inifile
class INIReader
def initialize(fileName)
@sections = {}
current_section, kv_hash = nil
File.open(fileName).each_line do |line|
line = line.strip
if line != ''
if line[0].chr == '[' and line[-1].chr == ']'
current_section = line[1, line.length - 2]
kv_hash = {}
else
kv = line.split("=")
kv_hash[kv[0]] = kv[1]
@sections[current_section] = kv_hash
end
end
end
end

def get_sections
@sections.keys
end

def get_keys(sectionName)
(@sections[sectionName]).keys
end

def get_value(sectionName, keyName)
(@sections[sectionName])[keyName]
end
end

reader = INIReader.new('clientconfig.ini')host=reader.get_value('config', 'host')port=reader.get_value('config','port')cl=Client.new(host,port)unless defined? Ocrawhile 1 cl.update_fileendend

相關文章
相關標籤/搜索