Ցանցային Չատ Բատով!

| Փետրվար 15, 2013 | Մեկնաբանված չէ |

Ես հասկանում եմ, որ հոդվածը շատ երկար է, սակայն չէի ցանկանում այն բաժանել, բացի դրանից այն երկար է կոդի պատճառով, այնպես, որ ՄԻ ԱԼԱՐԵՔ! :-)

 

 

 

 

 

 

 

Ինչ է պետք միացնելու համար?

 

  1. Copy անել կոդը, որը հոդվածի վերջում է
  2. Ստեղծել Bat ֆայլ
  3. Տեղադրել ցանցային պնակում
  4. Միացնել մի քանի համակարգիչներից

 

Նախաբան :-) Հիմանական տերմիններ

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 ================================================

Սկզբնաղյուր: Հայ Հաքեր Բլոգ

Ցանցային Չատ Բատով!, 10.0 out of 10 based on 4 ratings

Նշագրեր: , , , , , , , , ,

Բաժին: Ծրագրավորում, Ծրագրեր, Ուսումնական նյութեր

Կիսվել , տարածել , պահպանել

VN:F [1.9.20_1166]
Rating: 10.0/10 (4 votes cast)

Մեկնաբանեք

197