Train

PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : Socket programing in Ruby


mahrud
11-17-2009, 08:35 PM
سلام
منظور از ساخت اين thread:
آموزش socket programing در ruby از طريق مثال .

نکات:
من خودم هم در حال يادگيری هستم ،پس اگه اشکالی بود بگيد؛
مثال ها اکثراً سمت client هستند ،چون معمولاً روی server های ruby نصب نيست ،ولی شايد ... ;).

منابع:
Google ([Only registered and activated users can see links])،سايت IBM developerWorks ([Only registered and activated users can see links])،خودم ،مثال های ديگران و ...

با تشکر از PLUS ,MagicCoder + ...
موفق باشيد :x:x ./

mahrud
11-17-2009, 09:07 PM
اين برنامه همون طور که از اسمش پيداست ، اسم host رو ازتون ميپرسه ،بعد ip اون رو چاپ ميکنه:
#!/usr/bin/env ruby
#----------------------------------------
# Domain name to IP resolver
# Ashiyane Digital Security Team
# mahrud (dinovirus[at]gmail[dot]com)
# 4:23 PM Tuesday, November 17, 2009
#----------------------------------------

require 'socket'

puts "Please enter the domain name:"
hostname = gets

hostname = hostname.strip

ip = IPSocket::getaddress(hostname)
puts 'IP: ' + ip

موفق باشيد :x:x ./

mahrud
11-18-2009, 12:21 AM
سلام
اين يک سيستم چت خيلی ساده هست ،فقط مشکلش اينه که بعد از هر پيغام شما ،طرف مقابل هم بايد يک پيغام بفرسته ،و بلعکس ... :
#!/usr/bin/env ruby
#----------------------------------------
# Simple Chat Client (SCC)
# Ashiyane Digital Security Team
# mahrud (dinovirus[at]gmail[dot]com)
# 8:19 PM Tuesday, November 17, 2009
#----------------------------------------

require 'socket'

puts 'Please enter destination ip or domain name:'
destip = gets
destip = destip.strip
puts 'Please enter destination port:'
destport = gets
destport = destport.strip

streamSock = TCPSocket::new( destip, destport )

while 1
puts 'your message:'
msg = gets
streamSock.write( msg )
puts destip+'\'s message:'
str = streamSock.recv( 100 )
puts str
end

برای تستش:
روی سيستم مقابل:
$ nc -lvvp 12399
روی سيستم خودتون:
$ ruby scc.rb
بعد خود برنامه ميگه که چی رو وارد کنيد ... ;;)
موفق باشيد :x:x ./

mahrud
11-18-2009, 08:58 PM
سلام
اين هم يک chat server ساده هست ... يعنی الان شما بايد نحوه ی listen روی يک پرت و connect شدن به يک socket رو (اين يکی رو از روی پست قبل) بدونيد ...
به همين راحتی:
#!/usr/bin/env ruby
#----------------------------------------
# Simple Chat Server (SCS)
# Ashiyane Digital Security Team
# mahrud (dinovirus[at]gmail[dot]com)
# 4:49 PM Wednesday, November 18, 2009
#----------------------------------------

require 'socket'

puts "hi ;)\nthis is Simple Chat Server (SCS)\nwhich port do you want to listen to it?"
port = gets
port = port.strip
serv = TCPServer.new( port )

puts 'Waiting for client connection on port '+port
sock = serv.accept
puts 'Connection established ...'

while 1
puts 'client said:'
str = sock.recv( 100 )
puts str

puts 'Type your answer:'
msg = gets
sock.write( msg )
end
فقط مشکلش اينه که بايد بعد از هر پست شما ،clinet هم يه چيزی بگه ...
نکته: اوّل بايد client شروع به صحبت کنه :دی

نحوه ی تست:
روی server:
$ ruby scs.rb
بعد شماره ی پورتی رو که ميخوايد روش listen بشه رو انتخاب کنيد .
حالا روی client:
$ scc.rb
آدرس يا ip سيستم server رو وارد کنيد ،پورتی رو که server روش گوش ميکنه رو وارد کنيد ،پيغام خودتون رو بنويسيد :D.

موفق باشيد :x:x ./

mahrud
11-19-2009, 12:40 AM
سلام
اين مقاله ی سايت IBM DeveloperWorks ([Only registered and activated users can see links]) هست ،که به نظرم رسيد بهتره توی سايت attach کنم ...
چيز جالبيه ... توصيه ميکنم بخونيد ;).
توی يکی از بخش ها يه chat server هم نوشته ،ولی با ماله من فرق داره ... اونو هم بخونيد
موفق باشيد :x:x ./

mahrud
11-19-2009, 07:57 PM
سلام
هر سه تا کد قبلی رو دوباره بازنويسی کردم ،ولی اينبار بايد اطّلاعات رو بصورت argument به برنامه بديد ،براشون help هم گذشتم ،پس ديگه نيازی به گفتن نيست.

نکته:
چيزايی که ميتونيد از اين 3 تا کد ياد بگيريد:

گرفتن argument ها
if و while و else و end
اينکه چجوری بفهميم که کاربر argument داده يا نه
متد split


ipresolver: hostname to ip resolver
SCC: Simple Chat Client
SCS: Simple Chat Server


ويرايش: قابليت خاتمه دادن به ارتباط در scc و scs (هم از طرف server و هم از طرف client) اضافه شد.

موفق باشيد :x:x ./

mahrud
11-22-2009, 10:33 PM
سلام
اين بار هم SCC و SCS رو کامل تر کردم ،ولی خيلی تغييرات مهمی دادم ... thumbsup
قبلاً نميشد چند پيام با هم فرستاد :(،ولی الان بخاطر استفاده از multithreading ،ميتونيم چند تا پيام با هم بفرستيم (يعنی ديگه لازم نيست منتظر باشيد تا طرف مقابل هم يه پيام بفرسته تا شما بازم بتونيد تايپ کنيد).:)

از اين کد ها فقط ميتونيد اجرا کردن برنامه به طور موازی (Multithreading system/Parallel threading system) رو بفهميد .

نکته: اين کد هم يک اشکال ريز داره ;;)،وقتی شما ميخواهيد تايپ کنيد ،چون برنامه به صورت command-line هست ،اگر طرف مقابل پيغامی بفرسته ،بعد از ارسال پيغام شما نمايش داده ميشه ؛در حقيقت پيغام رسيده ،ولی چون منتظر ميمونه که شما تايپ کنيد ،نميتونه پيغام طرف مقابل رو چاپ کنه.:ii

يه مثال ساده تر برای درک بهتر multithreading ميزنم:
a = Thread.new do
puts 'a'
puts 'b'
sleep 0.1
puts 'c'
end

b = Thread.new do
puts 'x'
puts 'y'
sleep 0.1
puts 'z'

end

a.join
b.join

خروجی:
$ ruby test.rb
a
b
x
y
c
z

موفق باشيد :x:x ./
------
ويرايش: شرمنده ،حواسم نبود فايل ها رو اتچ کنم ;;)
و اينکه تو اين ورژن به خاطر يه اشکال کوچک فعلاً قابليت خاتمه دادن به ارتباط رو برداشتم

mahrud
11-27-2009, 06:04 PM
سلام
اين بار فقط server رو تغيير دادم ...
الان شما ميتونيد هم زمان 2 client رو به server وصل کنيد ... با اين حساب 3 نفر ميتونن با هم صحبت کنند ...

موارد آموزشی جديد:

کار با آرايه ها
ايده های جديد ... (بالاخره خيلی مهمه که برنامه نويس بدونه که چه کار بايد کنه!)


اشکالات:

client ها نميفهمند که پيغامی که مياد از طرف server هست ،يا client دومی
همچنان بايد با Ctrl + C از برنامه خارج بشيد

چه جالب ... فکر ميکردم فقط socket programing رو لازم دارم ... ولی کم کم همه ی بخش های روبی داره لازم ميشه ;)

موفق باشيد :x:x ./

mahrud
11-28-2009, 01:11 AM
سلام
اين يکی فکر کنم از همه پيچيده تر باشه ... چون خودمم وسط کار ميرفتم يه دوری بزنم ،وقتی بر ميگشتم گيج ميشدم!:o
در اين نسخه شما ميتونيد هم زمان هر چند تا client رو که بخواهيد به server وصل کنيد ،ولی ديگه server حق حرف زدن نداره ... فقط حرف های ديگران رو جا به جا ميکنه ... :p
يه چيزی مثل IRC شده ... ;)

نکته:

اوّل کد يه متغير به نام maxclients گزاشتم ،که بيشترين تعداد client ها رو مشخص ميکنه ...
البته اگه از بيشترين ميزان استفاده نشه هم مشکلی پيش نمياد ...
من فقط يه ورژن ديگه ميزارم که مشکلات خروج از برنامه و ... رو رفع کنه ،و يه خورده کار با برنامه رو ساده تر کنه ... بعد ميرم سراغ چيزی ديگه ... naughty
اگه bug داشت گزارش کنيد ممنون ميشم ... :x

موفق باشيد :x:x ./

mahrud
11-29-2009, 11:40 PM
سلام
من هی ميخوام اين سيستم چت رو ببندمش ... دوباره ادامه پيدا ميکنه ... :p;;)

اين بار تغييری که دادم ،اينه که 3 تا تابع ايجاد کردم ،يکی برای ارسال پيغام ،يکی برای دريافت پيغام ،و يکی هم راهنما رو نشون ميده.

ساختار ساده ی يک تابع:
def func( [input1 , ...] )
# do some processes with parameters
return output # returns the final output
end
#------------
func( [input1 , ...] ) # calling the function

مثال:
def func( name )
puts "hi #{name}"
puts "how old are you?"
age = gets
return age
end
#------------
puts func( 'mahrud' )

فقط چند تا ريزه کاری ديگه هم داره:

فقط اگه متغير global باشه ميتونه هم داخل و هم خارج تابع استفاده بشه ...
ولی ثوابت همه جا هستند ...

موفق باشيد :x:x ./

mahrud
11-30-2009, 12:10 AM
شرمنده ،باز يادم رفت کد رو ضميمه کنم ...
sorry ...

mahrud
12-03-2009, 07:40 PM
سلام
در اين مثال ،من تابع ها رو توی يک فايل ديگه گذاشتم و ازش استفاده کردم ...
يعنی اين يک مثال برنامه هايی است که چند فايل دارند ...
تنها نکته اش توی متغير ها هست ... که بايد حواستون بهشون باشه ...
موفق باشيد :x:x ./

mahrud
12-19-2009, 03:22 AM
سلام
بعد از مدت ها دوباره يه تغييراتی تو برنامه دادم که ميتونه مفيد واقع بشه ... thumbsup

مواردی که ميتونيد ياد بگيريد:

يه متود بهتر برای گرفتن argument ها (اين تو برنامه های درست و حسابی خيلی به کار مياد ...)
يه متود بهتر برای نشون دادن راهنمای برنامه


نکات:

دقت کنيد که عبارت RDoc::usage ،تمام خط های اول برنامه رو که با "#" شروع ميشند رو چاپ ميکنه ،تا برسه به اولين ختی که اين علامت رو نداره ؛
argument ها 3 نوع هستند ،يه نوع که نيازی نيست بهش ورودی بديم (مثل help--) ؛يه نوع که حتماً بايد به برنامه بديد تا اجرا بشه (مثل port--) ،و يه نوع که اختيری هست دادنش (که تو برنامه مثالش نيست) و بايد اينجوری تعريف کنيد:
[ '--name', GetoptLong::OPTIONAL_ARGUMENT ]

موفق باشيد :x:x ./