رفتن به مطلب

آموزش گام به گام سوکت نویسی در B4A (ارتباط با سرور)


J293

ارسال‌های توصیه شده

بسم الله الرحمن الرحیم

دوستان سلام امشب تصمیم گرفتم یه آموزش تقریبا جامع در مورد سوکت نوسی در B4A بدم بدون نیاز به دانش زبان های سمت سرور مثلا PHP یا نود جی اس و ... .

من الان فرض بر این میگیرم که شما با IP , Port , Socket تقریبا آشنایی دارید اگر هم مشکلی دارید میتونید توی گوگل جست و جو کنید خیلی زود متوجه خواهید شد .

یه مثال در مورد سوکت : شما پیام رسان تلگرام رو در نظر بگیرید برای اینکه متوجه بشه پیامی از شخصی (که البته از همون سرور) براش ارسال شده یا نه دو راه داره یا اینکه دائما سرور رو چک کنه که ببینه آیا پیامی برای من ارسال شده یا نه که مصرف منابع به شدت زیاد میشه یا هم اینکه از سوکت استفاده کنه که هم سریع و هم ایمن .

خوب همون طور که در جریان هستید ما باید در دو مرحله کد نویسی کنیم ، یک بار کلاینت ساید (کد های محلی که روی گوشی کاربر اجرا میشه) و یک بار هم سرور ساید (سرویس دهنده - کدی که روی سرور اجرا میشه ) اینجا ما برای کد نویسی کلاینت ساید از B4A و برای مد نویسی سرور ساید از B4J استفاده میکنیم . این دو خیلی از لحاظ سینتکس با هم شباهت دارن و این یه چیز بسیار مهم هست و داره میگه به همون اندازه که دانش کلاینت ساید داری دانش سرور ساید هم داری . هر چند گاهی کد ها کم و زیاد میشن که با یه سرچ کوچولو توی انجمن ها یا اصلا پرسیدنش توی همین تاپیک کاملا دستتون میاد . البته این رو هم بگم برای اجرای همچین برنامه هایی شما نیاز به یک VPS یا همون سرورمجازی دارید و روی هاست ها حساب نکنید ! کلا آموزشی که میدم برا وقتی هست که میخوای بازی آنلاین بسازی یا یه اپلیکیشن بزرگ آنلاین اینطوری دقیقا میدونی VPS کجای کاره . B4J مخفف Basic 4 Java هست یعنی اینجا بیسیک مینویسی برنامه نوشته شده به زبان جاوا تحویل میگیری .

یه قطعه کد مربوط به B4J که فکر کنم بدونید کارش چیه :

fx.Msgbox(MainForm,"Message","Title")
  
  

شروع کد نویسی سرور ساید (سمت سرویس دهنده) - B4J

- B4J رو اجرا کنید و پروژه رو به هر اسمی که میخوایید ذخیره کنید (اگر هم B4J رو ندارید میتونید 100% رایگان از وبگاه B4X.com دانلودش کنید)

- کتابخانه های jNetwork و jRandomAccessFile رو تیک بزنید .

یه توضیح کوتاه در مورد کتابخانه ها :

jNetwork : ما با این کتابخانه سوکت سرور رو میسازیم . سوکت کلاینت هم با همین کتابخانه ساخته میشه :bigsmile: دوستان میدونید که قبل از هر کاری باید سوکت ها رو هم توی سرور و هم توی کلاینت تعریف کنیم تا بتونن با هم ارتباط برقرار کنن در کل وظیفه این کتابخانه فعلا اینجا ساختن سوکت هاست. (توی B4A یعنی همون جایی که قراره کد های کلاینت رو بنویسیم باز از همین کتابخانه استفاده میکنیم) در ادامه بیشتر متوجه میشید.

jRandomAccessFile : کتابخانه قبلی که الان توضیح دادم کارش ساخت سوکت ها و اتصال سوکت ها به سرور بود ولی کاربرد ارسال داده رو برای ما نداشت ! بعد از اینکه سوکت ساخت شد و وصل شد نوبت به ارسال داده ها از جمله متن و فایل و ... میرسه که وظیفه این کتابخانه هست که باز در ادامه بیشتر متوجه خواهید شد .

خوب دیگه توضیح کافیه بریم سراغ کد نویسی

دو تا متغیر در قسمت Process_Globals تعریف میکنیم . به این صورت :

Private ServerSocket As ServerSocket
Private InputOutput As AsyncStreams

متغیر ServerSocket : متغیر مربوط به کتابخانه jNetwork می باشد و قراره باهاش سوکت سرور رو راه اندازی کنیم .

متغیر InputOutput : متغیر مربوط به کتابخانه jRandomAccessFile می باشد و قراره با هاش داده ای رو به کلاینت ارسال کنیم یا اگه داده از کلاینت به سرور امد متوجه بشیم و ... .

ادامه کد نویسی در قسمت AppStart :

	MainForm = Form1
	MainForm.RootPane.LoadLayout("Layout1") 'Load the layout file.
	MainForm.Show
	ServerSocket.Initialize(8080,"ServerSocketEvent")
	ServerSocket.Listen

  سه خط اول که همون Activity.Loadlayout خودمونه.

خط چهارم اومدم سوکت سرور رو ساختیم تو یه خط ! (کلا خاصیتش همینه خلاصه و ساده و قوی) اما ادامه ... 

8080 همون عدد پورت هستش و یه چیزی دل بخواهی فکر میکنم یه عددی بیشتر از 1024 چون پایین تر فکر کنم رزرو شده از آب دربیاد . به فرض مثال من میام پورت 8080 فقط برا ثبت نام و پورت 5423 رو فقط برای ورود (نه ثبت نام) و پورت 9721 رو فقط برای ارسال پیام بین کاربرا استفاده میکنم به این صورت که سه تا متغیر از نوع ServerSocket تعریف میکنم و با پورت های مختلف Initialize میکنم . 

"ServerSocketEvent" هم اسم رویداد متغیر هست . کاربردش جاییه که وقتی هر کاربر به سرور متصل شد باید رویدادی با این اسم اجرا بشه که باز درادامه بیشتر متوجه میشید .

خط آخر هم میگه ای متغیر ServerSocket فال گوش به ایست و هر کاربری که به سرور وصل شد سریعا رویداد "ServerSocketEvent" را اجرا کن . معنای لغوی Listen یعنی گوش دادن . در واقع خودش یه سرویس رو پشت زمینه راه اندازی میکنه و هر وقت کاربر جدید متصل شد رویداد مورد نظر که گفتم با اسم "ServerSocketEvent" ثبت کردیم رو اجرا میکنه .

خوب حالا در ادامه یه Sub به این شکل میسازیم :

Sub ServerSocketEvent_NewConnection (Successful As Boolean, NewSocket As Socket)
	
End Sub

این Sub مربوط به ServerSocket هستش و اگه توجه کنید با اسم ServerSocketEvent صدا زده شده. نحوه تعریفش به این صورت که ابتدا یک Sub مینویسیم بعد یه فاصله بعد یه TAB یه لیست ظاهر میشه شما باید گزینه ServerSocket رو انتخاب کنید سپس NewConnection را انتخاب میکنیم EventName رو ServerSocketEvent قرار میدیم و کلید Enter رو میزنیم .

توضیح در مورد ورودی ها :

Successful As Boolean : این متغیر که از نوع منطقی هم هست هر گاه که اتصالی که از سوی کلاینت صورت گرفته موفقیت آمیز باشه مقدار true و در غیر این صورت مقدارش false میشه .

NewSocket As Socket : این متغیر سوکت جدیدی که به سرور وصل شده رو بر میگردونه . اگه توجه کنید نوع این متغیر Socket هست در حالی متغیر ServerSocket ما از نوع ServerSocket بود . تفاوت سوکت سرور با سوکت کلاینت مشخصه . سوکت از نوع کلاینت اصلا رویدادی از نوع NewConnection نداره فقط یه رویداد داره که اون هم Connected هست و زمانی اجرا میشه که کلاینت به سرور متصل شده باشه البته این رویداد باید در قسمت کد نویسی کلاینت ساید نوشته بشه .

در ادامه کد های زیر رو درون Sub ServerSocketEvent_NewConnection قرار میدیم :

If Successful Then
		fx.Msgbox(MainForm,"سوکت جدید متصل شد","Successful")
		InputOutput.Initialize(NewSocket.InputStream,NewSocket.OutputStream,"InputOutputEvent")
		ServerSocket.Listen
End If

میگیم اگر اتصال سوکت جدید موفقیت آمیز بود کد های پایین رو اجرا کن . یه پیام نشون بده که میگه سوکت جدید متصل شد و خط سوم که از همه مهم تره ما میایم قابلیت ارسال  و دریافت داده رو با سوکت جدیدی که متصل شده رو راه اندازی میکنیم . در واقع متغیر InputOutput رو با ورودی  و خروجی سوکت جدیدی که متصل شده Initialize میکنیم . ورودی NewSocket.InputStream برای دریافت داده از سوکت جدید خروجی NewSocket.OutputStream برای ارسال داده به سوکت جدید . (هر چند ما همچین چیزی نداریم و من برای اینکه شما درک کنید میگم) . در دامه متغیر InputOutput رو با اسم رویداد "InputOutputEvent" نام گذاری میکنیم . کاربردش برای نام گذاری رویدادیه که هر وقت پیامی از سمت کلاینت برای سرور ارسال بشه اجرا میشه . کد زیر :

Sub InputOutputEvent_NewData (Buffer() As Byte)
	
End Sub

این Sub همونطور که گفتم زمان دریافت پیام از سمت کلاینت اجرا میشه . نحوه تعریفش به این  صورت که ابتدا یه Sub مینویسیم بعد یه فاصله بعد یه TAB یه لیست میاد AsyncStreams رو انتخاب کنید سپس گزینه NewData و با اسمی که InputOutputEvent همون اسم رویداد نام گذاری میکنم . آرایه Buffer که از نوع Byte هم تعریف شده همون پیامی هست که از سمت کلاینت برای ما ارسال شده . در واقع پیام دریافتی توی این آرایه قرار داره که باید تبدیل به String بشه کد هایی که باید داخل Sub InputOutputEvent_NewData نوشته بشن شکل زیر هستن :

Dim Message As String
Message = BytesToString(Buffer,0,Buffer.Length,"UTF-8")
fx.Msgbox(MainForm,Message,"Title")

متغیری از نوع String به نام Message تعریف کردیم قراره Buffer رو تبدیل به رشته کنیم و درون این متغیر بریزیم که در ادامه هم میبینید . 

BytesToString چیزیه که وظیفش تبدیل Bytes به String هست . بعد از نوشتنش پرانتز رو باز میکنیم اولین چیزی که  از ما میخواد اون آرایه از نوع Byte هست که قراره به رشته تبدیل بشه آرایه ما در اینجا Buffer بود که نوشتیم . در ادامه از ما میپرسه که از کجای آرایه شروع به تبدیل کردن به String بکنه ؟ که گفتیم از اولش یعنی 0 در ادامه هم طول آرایه رو وارد میکنیم که برابر با طول آرایه Buffer هست که شد Buffer.Length و  درآخر هم این کدینگ رو از ما میخواد که "UTF-8" رو وارد میکنیم تا مشکلی با کاراکتر های فارسی نداشته باشه . و ادامه هم در قالب یک Msgbox پیام دریافتی از کلاینت رو نمایش میدیم به همین سادگی .

 

برای ارسال داده به کلاینت من مثال زیر رو میزنم :

InputOutput.Write(Label1.Text.GetBytes("UTF8")

شما می تونید در هر جایی به کلاینت داده ارسال کنید . مثلا می تونید این رو توی رویداد کلیک یه دکمه قرار بدید تا وقتی روی دکمه کلیک شد این پیام به کلاینت ارسال بشه . ما از Write برای ارسال داده ها به کلاینت استفاده میکنیم هر چند توی کلاینت (B4A) هم به همین شکل برای ارسال داده به سرور استفاده میکنم  و هیچ تفاوتی نداره فقط یخورده توی تعریف سوکت با هم متفاوت هستن . چیزی که توی پرانتز وارد میکنیم همون چیزیه که قراره به سوکت ارسال بشه که از نوع Byte هست . کافیه بعد  نوشتن رشته مورد یه نقطه بزنید بعد هم Getbytes رو انتخاب کنید توی پرانتز مربوط به Getbytes این کدینگ رو وارد میکنم که باز UTF8 هست تا مشکلی با فارسی نداشته باشه . اینجا بین 8 و UTF خط فاصله نذاشتیم .

این بود کد نویسی سمت سرور .

شروع کد نویسی کلاینت ساید (سمت مشتری) - B4A

سریعا نرم افزار رو اجرا میکنیم و پروژه رو ذخیره میکنیم . کتابخانه های مربوطه یعنی Network و RandomAccessFile رو تیک میزینم .

متغیر ها رو به شکل زیر تعریف میکنیم :

Private Client As Socket
Private InputOutput As AsyncStreams

Client : سوکت کلاینت ما رو میسازه و قراره با سرور ارتباط برقرار کنه .

InputOutput : قراره داده های ما رو به سرور ارسال و اگر پیامی از سرور برای ما ارسال شد اون رو بخونه .

این هم کد های Activity_Create :

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout1")
	Client.Initialize("ClientEvent")
	Client.Connect("192.168.48.0",8080,20000)
End Sub

خط اول و دوم که هیچی خط سوم اومدیم متغیر Client رو قبل از هر کاری Initialize کردیم . کاربردش او جایی هست که میخواییم هر وقت به سرور متصل شد رویدادی اجرا بشه این اسم اون رویداد خواهد بود .

خط بعدش یعنی خط چهارم گفتیم ای سوکت کلاینت به سوکت سروری که آی پی آن 192.168.48.0 و با پورت 8080 منتظر تو نشسته وصل شو . آی پی ما آی پی VPS  ما هست شما باید با ریموت دسکتاپ به سرور مجازیتون وصل بشید و کد های B4J رو درونش بریزید و اجرا کنید . VPS رو از سرویس دهنده های معتبری که خدمات هاست و سرور و ... میدن خریداری کنید وصل شدن بهش هم خیلی راحته با Remote دسکتاپ نام کاربری و رمز عبور همراه با IP وارد میکنید بعد وارد سرور مجازیتون میشید . این چیزا رو از خدمات دهنده VPS  تون طلب کنید  اگر میخوایید فقط تست کنید از IP کامپیوتر خودتون استفاده کنید به شرطی که هم برنامه کلاینت و هم برنامه سرور داخل یک سیستم باشن یعنی داخل کامپیوتر خودتون . کلاینت رو با شبیه ساز تست کنید که داخل کامپیوتر خودتونه کد های B4J هم روی کامپیوتر خودتون اجرا  کنید .خوب بریم ادامه آموزش ... 

منظور از 20000 که اونجا نوشته شده یعنی 20000 میلی ثانیه (20 ثانیه) تلاش کن که به سرور وصل بشی اگر تونستی چه بهتر اگر نتونستی کلا دیگه بی خیال شو برو رد کارت . 0 یعنی بی نهایت تلاش کن .

خوب ما تا اینجا اومدیم سوکت کلاینت رو ساختیم و دستور دادیم به سرور وصل بشه با آدرس و پورت مربوط به سرور . حالا میاییم رویدادی تعریف میکنیم که هر وقت سوکت با موفقیت به سرور متصل شد اون رویداد اجر بشه . به شکل زیر عمل میکنیم :

Sub ClientEvent_Connected (Successful As Boolean)
	If Successful Then
		Msgbox("وصل شدیم !","")
		InputOutput.Initialize(Client.InputStream,Client.OutputStream,"InputOutputEvent")
	End If
End Sub

طریقه صدا زدنش به این صورت که یه Sub مینویسیم بعد یه فاصله بعد یه TAB از لیست باز شده گزینه Socket و بعد هم Connected رو انتخاب میکنیم .

در ادامه گفتیم اگر اتصال به موفقیت انجام شد یک Msgbox نمایش بده و بگو وصل شدیم و در آخر InputOutput رو با اسم "InputOutputEvent" نام گذاری کردیم که فکر کنم دیگه بدونید کارش چیه چون دقیقا مثل قسمت کد نویسی سمت سرور هست و گفتیم ورودی و خروجی تو بشه ورودی و خروجی متغیر Client که وصل شده به سرور .

دو سورس نمونه (سمت سرور و سمت کلاینت) نوشته شده توسط این جانب

به زودی بقیه اش رو قرار میدم + آموزش ارسال فایل و ... . تا همین جا همین تقریبا کامل گفتم چون از این به بعدش هیچ تفاوتی با هم ندارن چه کلاینت ساید چه سرور ساید .

لینک ارسال
به اشتراک گذاری در سایت های دیگر

لطفا در صورت امکان در اخر اموزش یک اموزش پروژه محور بازی یا شبکه اجتماعی بسازین و برا فروش بزارین

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خیلی عالی مرسی من دنبال میکنم 
ولی اگر یک بازی یا شبکه اجتماعی مانند بتونید مثال بزنید یا حتی یک چت چند نفره با بیسیک که مفهومی باشه و بدون در نظر گرفتن گرافیک فقط کد ها ممنون میشم 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 2 ماه بعد...
  • 2 ماه بعد...

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...