forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Клиент Сервер (http://forum.boolean.name/showthread.php?t=7275)

Conan Fedr 03.11.2008 23:10

Клиент Сервер
 
Вообщем давно не программировал просьба ногами непинать ) да и вообще с сетью особенно серверной ее частью практически не работал раньше. Теперь вот захотелось написать простенькую сетевую пулялку. Для начала решил написать сеть и вот что получилось ) а ничего, немогу определить когда идет инфа через сокет а когда нет подробнее смотрите функцию read_sockets() в сервере или цикл в клиенте. Подскажите пожалуйста.

Сервер
Код:

;Player
Type TConnection
 Field tcpstream%
 Field id%
End Type
;Listen Server on port 7777
tcpserv = CreateTCPServer(7777)
If tcpserv <> 0 Then
 Print "Listen Server Started!"
Else
 Print "Listen Server start Failed!"
EndIf
While True
 connection_accept(tcpserv)
 read_sockets()
 Delay 40
Wend
Function connection_accept%(tcps%)
 Local tcpst%
 tcpst = AcceptTCPStream(tcps)
 If tcpst Then
  Print "New user connected"
  WriteLine (tcpst,"You connect") ;temp
  new_connect.TConnection = New TConnection
  new_connect\tcpstream = tcpst
  Delete new_connect
  Return tcpst
 Else
  Return 0
 EndIf
End Function
Function read_sockets()
 For consock.TConnection = Each TConnection
  If packet = ReadLine(consock\tcpstream)
  Print packet
  WriteLine(consock\tcpstream,"You message OK")
  EndIf
 Next
End Function

Клиент:
Код:

tcp = OpenTCPStream("127.0.0.1",7777)
If tcp Then
 Print "connected"
Else
 Print "not connected"
EndIf
While True
 If packet = ReadLine(tcp)
  Print packet
 EndIf
 Input Mesage$
 WriteLine(tcp,Mesage)
 Delay 25
Wend


Tadeus 04.11.2008 15:52

Ответ: Клиент Сервер
 
Я могу ошибаться, но по-моему функция должна быть такой:

Код:

Function read_sockets()
 For consock.TConnection = Each TConnection
  If ReadAvail(consock\tcpstream)>0 Then
  packet = ReadLine(consock\tcpstream)
  Print packet
  WriteLine(consock\tcpstream,"You message OK")
  EndIf
 Next
End Function

И в клиенте:

Код:

tcp = OpenTCPStream("127.0.0.1",7777)
If tcp Then
 Print "connected"
Else
 Print "not connected"
EndIf
While True
 If ReadAvail(tcp)>0 Then
  packet = ReadLine(tcp)
  Print packet
 EndIf
 Input Mesage$
 WriteLine(tcp,Mesage)
 Delay 25
Wend

Если я правильно все понял...

ЮПД: Ах да, сервак ждет каждый раз нового клиента вроде. Ты должен записывать куда-нибудь указатель на поток )

Conan Fedr 05.11.2008 00:12

Ответ: Клиент Сервер
 
Код:

Function connection_accept%(tcps%)
 Local tcpst%
 tcpst = AcceptTCPStream(tcps)
 If tcpst Then
  Print "New user connected"
  WriteLine (tcpst,"You connect") ;temp
  new_connect.TConnection = New TConnection
  new_connect\tcpstream = tcpst
  Delete new_connect
  Return tcpst
 Else
  Return 0
 EndIf
End Function

Так вот же вроде бы тут и записываю хендл потока в поле tcpstream .
Спасибо за функцию ReadAvail , но возникли проблема я подозреваю что что то я нето с типами делаю. потому что если с клиента слать что то на сервер реакции ноль как будто потока несуществует, посмотри пожалуйста правельно ли я с типом работаю пото му что подозрения что в поле типа ничего незаписывается , а в дебагере нет возможности проверить. Спасибо

Damp 05.11.2008 15:34

Ответ: Клиент Сервер
 
Возможно потому что тестируешь все на одном компе. Я тоже не смог TCP затестить на 1 машине.

Tadeus 05.11.2008 15:59

Ответ: Клиент Сервер
 
Код:

;Player
Type TConnection
 Field tcpstream%
 Field id%
End Type
;Listen Server on port 7777
tcpserv = CreateTCPServer(7777)
If tcpserv <> 0 Then
 Print "Listen Server Started!"
Else
 Print "Listen Server start Failed!"
EndIf
While True
 connection_accept(tcpserv)
 read_sockets()
Wend

Function connection_accept%(tcps%)
 Local tcpst%
 tcpst = AcceptTCPStream(tcps)
 If tcpst Then
  Print "New user connected with IP"
  WriteLine (tcpst,"You connect") ;temp
  new_connect.TConnection = New TConnection
  new_connect\tcpstream = tcpst
  Return tcpst
 Else
  Return 0
 EndIf
End Function

Function read_sockets()
 For consock.TConnection = Each TConnection
  If ReadAvail(consock\tcpstream)>0 Then
  packet$=ReadLine$(consock\tcpstream)
  Print packet
  WriteLine(consock\tcpstream,"You message OK")
  EndIf
 Next
End Function

Вот уже сервак отсылает что сообщение дошло ) Ты забыл поставить знак $. А вот почему оно не читает - не совсем понятно )


Часовой пояс GMT +4, время: 12:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot