purebasic.info

PureBasic forum
Текущее время: Пн июл 13, 2020 9:08 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Клиент - Сервер + Потоки
СообщениеДобавлено: Ср июн 24, 2020 1:20 pm 
Не в сети
ассистент

Зарегистрирован: Пт апр 17, 2020 10:01 pm
Сообщений: 15
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Подскажите, как в поток получать с одного клиента данные все. Если пакеты дробятся, то создаётся новый поток.

И попутный вопрос, как логи писать в один гаджет/файл с основного потока и потоков) Удобно логи вести всё же в одном месте)

Спасибо!=)

Server
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
EnableExplicit
 
Enumeration
  #okno_base
  #okno_logi
EndEnumeration
 
#Port = 26832
 
Global Mutex = CreateMutex()
 
 
Procedure _logi (t$)
  AddGadgetItem(#okno_logi, -1, FormatDate("%yyyy.%mm.%dd %hh:%ii:%ss ", Date()) + t$)
EndProcedure
 
 
Procedure p_NetworkData(*ne_ispolzuetca)
 
  Macro _logiT (t)
    LockMutex (mutex)
    AddGadgetItem(#okno_logi, -1, FormatDate("%yyyy.%mm.%dd %hh:%ii:%ss ", Date()) + t)
    UnlockMutex (mutex)
  EndMacro
 
   Define ClientID = EventClient()
   Define ClientIP$ = IPString(GetClientIP(ClientID))
 
   
  Define ttt=$FFFF
  Define *Buffer = AllocateMemory(ttt)
  Define dlina = 0
 
    ;Repeat
    Define polucheno = ReceiveNetworkData(ClientID, *Buffer, $FF)
    _logiT (Str(ClientID) +": Получено "+polucheno+" байт)")
;     If (ElapsedMilliseconds()-timer_nachalo) > 200000 Or dlina > $FF; Or polucheno = -1
;         FreeMemory (*Buffer)
;         Potoki-1
;         _logiT (Str(ClientID)+"/"+ClientIP$+"Данные не удалось получить. Поток завершён")
;         ProcedureReturn
;     EndIf
    ;dlina+polucheno
    ;_logi (Str(dlina))
    Delay(10)
  ;Until dlina=$FF
 
  _logiT ("Получено!")
 
  FreeMemory (*Buffer)
  _logiT ("Potoki-1")
 
EndProcedure
 
 
OpenWindow(#okno_base, 0, 0, 1000, 600, "Server", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
 
EditorGadget(#okno_logi, 0, 0, 1000, 600, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
 
 
If InitNetwork() = 0
  MessageRequester ("", "Ошибка инициализации сети!")
  End
EndIf
 
 
 
If CreateNetworkServer(0, #Port, #PB_Network_TCP)
 
  Repeat
   
    Define SEvent = NetworkServerEvent()
    If SEvent
      ;ClientID = EventClient()
      ;ClientIP$ = IPString(GetClientIP(ClientID))
      Select SEvent
        Case #PB_NetworkEvent_Connect
          _logi ("connected")
        Case #PB_NetworkEvent_Data
          If CreateThread(@p_NetworkData(),0)
            _logi ("Potoki+1")
            Delay(10)
          EndIf
         
        Case #PB_NetworkEvent_Disconnect
      EndSelect
    EndIf
 
    Delay(10)
  Until WindowEvent() = #PB_Event_CloseWindow
 
  CloseNetworkServer(0)
 
Else
MessageRequester ("", "Ошибка - невозможно создать сервер. Возможно занят порт.")
EndIf
 
 
End


client
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
EnableExplicit
 
Enumeration
  #okno_base
  #okno_logi
EndEnumeration
 
Global server$="127.0.0.1"
 
If InitNetwork() = 0
  Debug ("Ошибка инициализации сети!")
  End
EndIf
 
Procedure _logi (t$)
  AddGadgetItem(#okno_logi, -1, FormatDate("%yyyy.%mm.%dd %hh:%ii:%ss ", Date()) + t$)
EndProcedure
 
Procedure _SendText(t$)
  _logi (t$)
   
Define ttt=$FFFF
Define *Buffer = AllocateMemory(ttt)
 
Define ConnectionID = OpenNetworkConnection(server$, 26832)
 
; Repeat
   Define dlina = SendNetworkString(ConnectionID, t$)
;   Delay(100)
; Until dlina=-1
 
 EndProcedure
 
 
 Procedure _SendData(*t, t_dlina)
  _logi ("Данные "+t_dlina+" байт")
   
Define ConnectionID = OpenNetworkConnection(server$, 26832)
 
; Repeat
   Define dlina = SendNetworkData(ConnectionID, *t, t_dlina)
;   Delay(100)
; Until dlina=-1
 
EndProcedure
           
 
OpenWindow(#okno_base, 0, 0, 1000, 600, "Client for "+server$, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
 
EditorGadget(#okno_logi, 0, 0, 1000, 600, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
 
_SendText ("Проверка")
 
Define ttt=$FFFF
Define *Buffer = AllocateMemory(ttt)
 
_SendData (*Buffer, $FFF)
 
 
Repeat
  Delay(10)
Until WindowEvent() = #PB_Event_CloseWindow
 
 
End



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Клиент - Сервер + Потоки
СообщениеДобавлено: Ср июн 24, 2020 2:18 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11708
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
Зачем множество потоков?
В одном потоке можно работать с тысячами клиентов и серверов.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Клиент - Сервер + Потоки
СообщениеДобавлено: Ср июн 24, 2020 2:20 pm 
Не в сети
ассистент

Зарегистрирован: Пт апр 17, 2020 10:01 pm
Сообщений: 15
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Зачем множество потоков?
В одном потоке можно работать с тысячами клиентов и серверов.


Одновременно? А если кто-то будет сильно тормозить из клиентов, я так понимаю другой пакет принимать в это время не получится?)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Клиент - Сервер + Потоки
СообщениеДобавлено: Ср июн 24, 2020 2:30 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11708
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
Skawer писал(а):
Одновременно?
Для примера https://pbtorrent.ucoz.ru/load/iskhodny ... _2/1-1-0-5
Работа с большим числом клиентов/серверов в одном потоке.

Skawer писал(а):
А если кто-то будет сильно тормозить из клиентов
Это зависит от того как написан код. Не нужно ждать пака клиент пришлет все данные. Считываем то что прислал и разбираем пакет когда он полностью принят.
viewtopic.php?f=8&t=3035

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Клиент - Сервер + Потоки
СообщениеДобавлено: Ср июн 24, 2020 8:21 pm 
Не в сети
ассистент

Зарегистрирован: Пт апр 17, 2020 10:01 pm
Сообщений: 15
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Один и тот же ID выдаётся разным клиентам, это нормально?:)

клиент
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf
 
;ServerIP$ = "127.0.0.1"
ServerIP$ = "46.48.86.19"
ServerPort = 26832
 
 
ConnectionID = OpenNetworkConnection(ServerIP$, ServerPort)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)
 
  SendNetworkString(ConnectionID, "An hello from a client !!! :-)", #PB_UTF8)
   
  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
 
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf



сервер
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
;
;   Server
;
 
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf
 
Port = 26832
*Buffer = AllocateMemory(1000)
 
 
OpenConsole("KarkaSka Server")
 
 
If CreateNetworkServer(0, Port)
 
  PrintN("Server: Created (Port "+Str(Port)+").")
 
  Repeat
   
       
    SEvent = NetworkServerEvent()
     
    If SEvent
     
       ClientID = EventClient()
       
     
      Select SEvent
        Case #PB_NetworkEvent_Connect
          ClientIP$ = IPString(GetClientIP(ClientID))
          PrintN("Server: Client "+Str(ClientID)+" ("+ClientIP$+") has connected !")
 
 
        Case #PB_NetworkEvent_Data
          PrintN("Server: Client "+Str(ClientID)+" ("+ClientIP$+") has send a packet !")
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          PrintN("Client "+Str(ClientID)+" ("+ClientIP$+") send: "+PeekS(*Buffer, -1, #PB_UTF8))
 
        Case #PB_NetworkEvent_Disconnect
          PrintN("Server: Client "+Str(ClientID)+" ("+ClientIP$+") has closed the connection...")
          ;Quit = 1
      EndSelect
     
    EndIf
 Delay(3)  
  Until Quit = 1
 
  CloseNetworkServer(0)
Else
  PrintN("Error: Can't create the server (port in use ?).")
EndIf
 
PrintN("Press ENTER key to exit.")
Input()
CloseConsole()
 
End



Вложения:
2020-06-24 22-19-28 KarkaSka Server.png [16.26 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Клиент - Сервер + Потоки
СообщениеДобавлено: Ср июн 24, 2020 8:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11708
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
Да если предыдущий отключился. У подключенных клиентов будут разные ID.
Код:
1
2
3
4
5
6
InitNetwork()
 
OpenNetworkConnection("127.0.0.1", 26832)
OpenNetworkConnection("127.0.0.1", 26832)
OpenNetworkConnection("127.0.0.1", 26832)
OpenNetworkConnection("127.0.0.1", 26832)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB