Ցանցային Չատ Բատով!
Ես հասկանում եմ, որ հոդվածը շատ երկար է, սակայն չէի ցանկանում այն բաժանել, բացի դրանից այն երկար է կոդի պատճառով, այնպես, որ ՄԻ ԱԼԱՐԵՔ!
Ինչ է պետք միացնելու համար?
- Copy անել կոդը, որը հոդվածի վերջում է
- Ստեղծել Bat ֆայլ
- Տեղադրել ցանցային պնակում
- Միացնել մի քանի համակարգիչներից
Նախաբան
Հիմանական տերմիններ
1. %chat% — խմբի անուն
2. %nick% — օգտանուն
3. Ֆայլ “%chat%_history” — Խմբի ամբողջ պատմությամբ ֆայլ
4. Ֆայլ “%chat%” — խմբի վերջին հաղորդագրությամբ ֆայլ
5. Ֆայլ “%chat%_cs” — սինխրոնիզացիայի համար օգտագործվող ֆայլ
Բացենք չատի ծրագիրը (կոդը տրված է հոդվածի վերջում)` Ամենասկզբում վերցնում ենք խմբի անունը, օգտանունը և հետո կոդը սկսում է ինքն իրան 3 արգումենտներով` Talk_widget, Խմբի անուն, Օգտանուն
:auth
echo Enter chat filename to connect ("abc" for example):
set /p chat=^>
echo Enter your nick:
set /p nick=^>
start call %0 talk_widget %chat% %nick%
Հիմա ծրագրի վերնամասում գրում ենք խմբի անունը և օգտանունը (տող №3). Եթե գոյություն ունի %chat%_history ֆայլը, ապա դուրս ենք բերում էկրանին նրա պարունակությունը (տող №4). Հետո, ցիկլում, վերլուծում ենք %chat% ֆայլի պարունակությունը և համեմատում անցաց վերլուծման հետ. Եթե փոփոխություն է տեղի ունեցել, ապա դուրս ենք բերում էկրանին.
:listener cls call title "| Chat: %chat% | User: %nick% |" if exist %chat%_history type %chat%_history if not exist %chat% echo. 2>%chat% :listener_loop ping 127.0.0.1 -n 1 -w 20 > nul set oldtext=%text% set /p text=<%chat% if not "%text%" == "%oldtext%" echo %text% goto listener_loop
Ամենասկզբում կոդը ունի հետևյալ կառուցվածքը: միացնելուց, կոդը ստուգում է արգումենտները, և եթե առաջինը talk_widget-ն է, ապա այն կատարում է գործողություններ միայն տեքստի ուղարկման հետ կապված. Դրա բացակայության դեպքում, կոդը կատարում է ստանալու և ցույց տալու ֆունկցիա: Սկզբում կոդը միացվում է առանց արգումենտների, վերցնելով միայն խմբի անունը և օգտանունը, իսկ հետո միացնում է կոդը talk_widget արգումենտով, այնուհետև սկսում է դուրս բերել տվյալները էկրանին:
if "%~1" == "talk_widget" goto talker :listener ...... :talker ......
Հիմա բացատրեմ, թե ինչպես է աշխատում այն կոդը, որը տվյալներ է վերցնում օգտվողից. Սկզբում այն փոփոխում է վերնամասը (տող №5). Հետո ֆայլում տպում է վերջին հաղորդագրությունը-ավելացնում իր միանալու մասին տեղեկություն և ավելացնում չատի պատմությունը. Վերջին հաղորդագրության ֆայլին դիմելուց օգտագործվում է կրիտիկական բաժինների պարզագույն մեխանիզմ (ներքևում կդիտարկենք դրա աշխատանքը):Հետո ցիկլում (տող 11-19) կատարվում է օգտվողից տվյալների ստացում և նրանց գրանցումը վերջին հաղորդագրության ֆայլում և խմբի պատմության ֆայլում:
:talker set chat=%~2 set nick=%~3 cls call title "| Chat: %chat% | User: %nick% |" call ::cs_in echo (%TIME% %nick% connected)>%chat% call ::cs_out echo (%TIME% %nick% connected)>>%chat%_history :talker_loop cls echo Dear %nick%, type message to send: set /p msg=^> call ::cs_in echo [%TIME% %nick%]: %msg%>%chat% call ::cs_out echo [%TIME% %nick%]: %msg%>>%chat%_history goto talker_loop
Ֆայլի կրիտիկական բաժին մտնելու ֆունկցիան, որը օգտագործվում է սինխրոնիզացիայի համար, ցիկլում գրում է կամայական թիվ. Մինչև այն չհայտնվի այնտեղ 2-րդ անգամ ստուգելուց. Եթե ֆունկցիան սկսելու ժամանակ ֆայլը գոյություն ունի, ապա մի փոքրիկ դադար է լինում. Դադարները լինում են ի շնորհիվ ping>nul.
:cs_in if exist "%chat%_cs" ping 127.0.0.1 -n 1 -w 50 > nul set cs_value=%RANDOM% :cs_in_loop echo %cs_value%>%chat%_cs set /p ret=<%chat%_cs if "%ret%" == "%cs_value%" exit /b ping 127.0.0.1 -n 1 -w 10 > nul goto :cs_in_loop
Կրիտիկական բաժնից դուրս գալու ֆունկցիան ուղղակի ջնջում է սինխրոնիզացիայի ֆայլը:
:cs_out del %chat%_cs exit /b
Իսկ հիմա արդյունքը!
Մենք ստացանք չատ, որը ունի հետևյալ ֆունկցիաները: 1. Խմբերի բաժանված չատ (շատ խմբեր, շատ օգտվողներ) 2. Նոր մասնակիցներին հնարավորություն է տրվում ստանալ չատի պատմությունը 3. Հաղորդակցվել ցանցում (տեղադրել ֆայլը ընդհանուր պնակում և շփվել տարբեր համակարգիչներից)
Միացնելուց, ծրագիրը հարցնում է խմբի անունը և օգտանունը. 
Տվյալները մուտքագրելուց հետո բացվում է 2-րդ պատուհանը, որտեղ կարող եք գրել:
Իսկ հիմա նույն BAT-ը բացենք ցանցի մեկ այլ համակարգչից (ֆայլը գտնվում է բաց* պնակում
Մուտքագրելով նույն խմբի անունը և նոր օգտանուն, դուք կմտնեք չատ-սենյակ 
Իսկ հիմա փորձենք փոխանակվել հաղորդագրություններով:
Իսկ հիմա նույնը, բայց 3-րդ համակարգչից
Եվ կտեսնենք այս պատկերը`
Ուշադրություն! Windows XP-ՕՀ-ի վրա ծրագիրը նորմալ աշխատում է, սակայն կա անհասկանալի 64 bit- անոց Windows 7-վրա: կոդը ցանցային պնակից միացնելու ժամանակ //***. Կոդի 3-րդ տողը` pushd “%~dp0″ շատ երկար է աշխատում. Շատ երկար է աշխատում հենց %~dp0, դրա համար փորձեք echo %~dp0. Եթե 2-3 րոպե սպասեք ամեն ինչ նորմալ կլինի:
Զգուշացում: Ցանցային պնակից կոդը ամեն անգամ միացնելուց, My Computer-ում կհայտնվեն ցանցային դիսկեր` Z,Y,X, սակայն դրանք կվերանան համակարգիչը վերսկսելուց հետո (Restart):
Ահա և ամբողջ կոդը:
@rem BatChat
@echo off
cls
pushd "%~dp0"
echo Current DIR: "%CD%"
if "%~1" == "talk_widget" goto talker
rem ================================================
rem ////////////////////
:auth
echo Enter chat filename to connect ("abc" for example):
set /p chat=^>
echo Enter your nick:
set /p nick=^>
start call %0 talk_widget %chat% %nick%
rem ////////////////////
:listener
cls
call title "| Chat: %chat% | User: %nick% |"
if exist %chat%_history type %chat%_history
if not exist %chat% echo. 2>%chat%
:listener_loop
ping 127.0.0.1 -n 1 -w 20 > nul
set oldtext=%text%
set /p text=<%chat% if not "%text%" == "%oldtext%" echo %text% goto listener_loop rem //////////////////// rem ================================================ rem //////////////////// rem // %2 - chat name // rem // %3 - user nick // rem //////////////////// :talker set chat=%~2 set nick=%~3 cls call title "| Chat: %chat% | User: %nick% |" call ::cs_in echo (%TIME% %nick% connected)>%chat%
call ::cs_out
echo (%TIME% %nick% connected)>>%chat%_history
:talker_loop
cls
echo Dear %nick%, type message to send:
set /p msg=^>
call ::cs_in
echo [%TIME% %nick%]: %msg%>%chat%
call ::cs_out
echo [%TIME% %nick%]: %msg%>>%chat%_history
goto talker_loop
rem ////////////////////
rem ================================================
rem ////////////////////
:cs_in
if exist "%chat%_cs" ping 127.0.0.1 -n 1 -w 50 > nul
set cs_value=%RANDOM%
:cs_in_loop
echo %cs_value%>%chat%_cs
set /p ret=<%chat%_cs if "%ret%" == "%cs_value%" exit /b ping 127.0.0.1 -n 1 -w 10 > nul
goto :cs_in_loop
rem ////////////////////
rem ////////////////////
:cs_out
del %chat%_cs
exit /b
rem ////////////////////
rem ================================================
Սկզբնաղյուր: Հայ Հաքեր Բլոգ
Բաժին: Ծրագրավորում, Ծրագրեր, Ուսումնական նյութեր











