PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Сервер и несколько клиентов


Сервер и несколько клиентов

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

1

Здравствуйте, начал ковырять библиотеку Network вот назрел вопрос. Как сделать чтобы сервер принимал события от 2 клиентов, а также мог сам чтолибо отправлять на 2 и более клиента. Я написал простую программку, сервер<=>клиент, они друг другу могут отправлять сообщения, но когда запуская клиент повторно, работает только последний запущенный, а не оба. Объясните пожалуйста, как можно отследить конкретного клиента, код только приветствую. Я пишу с телефона. Завтра могу кинуть код своего клиента и сервера.
Надеюсь на помощь, заранее спасибо.

Отредактировано Racer (28.08.2013 10:49:46)

0

2

При возникновении событий сервера, функция EventClient() вернет идентификатор связи с клиентом. Он уникален для всех клиентов, с которыми в данный момент установлена связь (но если с клиентом была разорвана связь, то вновь подключившийся может получить точно такой же идентификатор). Его нужно запомнить (например, в связанном списке) и по нему идентифицировать клиентов.

0

3

Что-то я так и не понял.

0

4

В справке NetworkServer.pb нормальный пример.

0

5

В простейшем случае, можно выделять отдельный поток на клиента, но это не самый лучший вариант и допустимо если одновременно подключено не больше 20-ти клиентов, да и могут возникнуть проблемы с синхронизацией. Пример. Пример WEB-сервера на PureBasic

Но лучше сделать как я писал выше, что-то типа (потянет тысячи, а то и десятки тысяч одновременных подключений):

Код:
InitNetwork()

Structure ClientParam
  ID.i
  ; Далее должны быть другие параметры клиента.
EndStructure

NewList ClientList.ClientParam()

Procedure Client(List Clients.ClientParam())
  ; Здесь необходимо "просмотреть" весь список клиентов и отправить данные некоторым, если это нужно.
EndProcedure

If CreateNetworkServer(0, 1000)

  *Buffer = AllocateMemory(1000)

  Repeat
    
    SEvent = NetworkServerEvent()
    
    If SEvent
      
      ClientID = EventClient()
      
      Select SEvent
          
        Case #PB_NetworkEvent_Connect
          If AddElement(ClientList()) ; Подключен новый клиент - запоминаем его ID.
            ClientList()\ID = ClientID
          EndIf
          
        Case #PB_NetworkEvent_Data ; Клиент прислал данные
          
          InBytes = ReceiveNetworkData(ClientID, *Buffer, 1000)
          
          If InBytes>0
            
            ForEach ClientList()
              If ClientList()\ID = ClientID ; Нашли клтента в списке
                
                ; Работа с клиентом.
                
                Break
              EndIf
            Next
            
          EndIf
          
        Case #PB_NetworkEvent_Disconnect
          
          ForEach ClientList() ; Клиент отключится - удаем данные о нем.
            If ClientList()\ID = ClientID
              DeleteElement(ClientList())
              Break
            EndIf
          Next
          
      EndSelect
      
    Else ; Нет событий сервера.
      Delay(20)
    EndIf
    
    Client(ClientList())
    
  ForEver
EndIf

Если нужен реальный пример программы, то можно посмотреть исходники торрент-клиента, к которому одновременно могут быть подключены тысячи пиров. http://pbtorrent.ucoz.ru/load/iskhodnyj … _2/1-1-0-5

Работа с сервером находится в файле Core.pbi в процедуре Core_NetworkEvent_Thread().
Собственно вот этот участок кода.

Код:
          Select SEvent
            ;Case #PB_NetworkEvent_Connect
            Case #PB_NetworkEvent_Disconnect
              Peer_ServerDisconnect(@Local_TorrentList, ClientID)
            Case #PB_NetworkEvent_Data
              FillMemory(*Buffer, 65536, 0)
              
              Size = ReceiveNetworkData(ClientID, *Buffer, 65536)
              If Size>0 And Size<=65536
                Peer_ServerCore(ClientID, *Buffer, Size, @Local_TorrentList)
              EndIf
              
          EndSelect

+1

6

Петр спасибо, вроде что-то начало получатся, спасибо за код со списком. Буду разбирать дальше.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Сервер и несколько клиентов