Ես հասկանում եմ, որ հոդվածը շատ երկար է, սակայն չէի ցանկանում այն բաժանել, բացի դրանից այն երկար է կոդի պատճառով, այնպես, որ ՄԻ ԱԼԱՐԵՔ!
Ինչ է պետք միացնելու համար?
- 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 ================================================
Սկզբնաղյուր: Հայ Հաքեր Բլոգ
Comments: no replies