watt Posted September 16, 2006 at 08:33 PM Report Share #51051 Posted September 16, 2006 at 08:33 PM Oi pessoal! há coisa de uns meses acordei e pensei em criar um jogo on-line de futebol, e comecei... criei a bd em mysql, o motor do jogo e o cliente ... mais tarde tive problemas com a velocidade das consultas á BD, então resolvi alterar o meu jogo. Implementei a transferencia de dados por UDP e agora estou a ter outro problema, que é quando o servidor envia dados para o cliente nem sempre chegam, mas do cliente para o server nunca falhaou. Eu sei que o protocolo udp é o mais rapido, mas não se sertifica se o cliente recebe os dados, calculo que seja isso que me está a acontecer. que é que voces recomendão ?? já pensei em por o cliente a enviar dados para o servidor em udp e o servidor para o cliente em tcp/ip. Link to comment Share on other sites More sharing options...
NuGuN Posted September 17, 2006 at 05:58 PM Report Share #51210 Posted September 17, 2006 at 05:58 PM Eu se fosse a ti utulizava a TCP para os 2! Cumps Link to comment Share on other sites More sharing options...
Hipnoted Posted September 17, 2006 at 06:17 PM Report Share #51213 Posted September 17, 2006 at 06:17 PM Eu não percebo nada de VB .NET, mas o mesmo já não se passa com UDP e TCP. Se fosse a ti escolhia apenas um dos dois para tudo. Ou seja não usava TCP para um e UDP para outro. Eu escolheria TCP, apesar de se rmais lento é mais fiável. 😄 "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência" Link to comment Share on other sites More sharing options...
watt Posted September 17, 2006 at 09:31 PM Author Report Share #51242 Posted September 17, 2006 at 09:31 PM tão acho que me vou dedicar ao tcp. Mas quando se fala de de ser mais lento,é micro segundos "a olho nu" não se nota... ou nota-se ? alguem daki tem manuais de tcp/ip para vb.net? é que a ultima vez que tentei usar isso deu buraco, só conseguia uma ligação de cada vez ao servidor, e não consegui por os dois a enviar e receber dados ao mesmo tempo. Link to comment Share on other sites More sharing options...
Hipnoted Posted September 17, 2006 at 09:50 PM Report Share #51244 Posted September 17, 2006 at 09:50 PM tão acho que me vou dedicar ao tcp. Mas quando se fala de de ser mais lento,é micro segundos "a olho nu" não se nota... ou nota-se ? alguem daki tem manuais de tcp/ip para vb.net? é que a ultima vez que tentei usar isso deu buraco, só conseguia uma ligação de cada vez ao servidor, e não consegui por os dois a enviar e receber dados ao mesmo tempo. Não se nota muito. Aliás não se nota em transferências pequenas... "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência" Link to comment Share on other sites More sharing options...
watt Posted September 17, 2006 at 11:19 PM Author Report Share #51260 Posted September 17, 2006 at 11:19 PM tão para aquilo que eu quero deve dar. o que o meu programa faz é enviar comandos sql e receber as respostas... e num futuro é cordenadas de alguns objectos Link to comment Share on other sites More sharing options...
TheDark Posted September 18, 2006 at 08:42 PM Report Share #51443 Posted September 18, 2006 at 08:42 PM O UDP é para ser utilizado em ligações que não sofram muito com pequenas falhas. O que não é o teu caso. Já o TCP é para ser utilizado em ligações em que é crítico que toda a informação enviada chegue ao seu destino, o que é o teu caso 😄 Desaparecido. Link to comment Share on other sites More sharing options...
shumy Posted September 23, 2006 at 06:56 PM Report Share #52275 Posted September 23, 2006 at 06:56 PM Decide-te, vas usar um servidor SQL ou vas usar TCP com um protocolo inventado por ti? É que vas acabar sempre por usar TCP já que as comunicações SQL são TCP. Normalmente não se utiliza BD's sql como repositórios de dados para jogos em tempo real on-line. Mas se é só umas coordenadazitas, não é isso que vai atrasar. Só vejo uma situação muito especifica (que pode ser a tua) em que o uso de UDP podia ser o melhor. Dentro de uma intranet com o servidor a fazer multicast para os seus clientes, mas claro, com um processo que controla as chegadas das mensagens, evitando perda destas. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática! Link to comment Share on other sites More sharing options...
HecKel Posted September 23, 2006 at 09:17 PM Report Share #52294 Posted September 23, 2006 at 09:17 PM Bem, li isto na diagonal e tenho ideia que já referiram isto aqui, mas resumidamente: UDP - NÃO te garante que os pacotes chegam ao destino, tu nunca sabes esta informação. Se algum pacote se perder tu não vais saber qual foi para o reenviar (logo, para o teu problema NÃO SERVE) TCP - Fiabilidade! A cada pacote recebido é retransmitido um acknoledgement (confirmação) para o emissor de forma a indicar que o pacote foi recebido correctamente. Se o pacote se perder, ou o acknoledgement o emissor envia novamente o pacote que poderá ser sobreposto. Ou seja, acabas por receber sempre tudo e o emissor SABE que foi recebido com sucesso! (é isto que queres) Basicamente..., é isto 😉 abraços, HecKel Look Left Blog Link to comment Share on other sites More sharing options...
watt Posted September 24, 2006 at 12:20 AM Author Report Share #52315 Posted September 24, 2006 at 12:20 AM já estou a trabalhar no tcp ip, ainda estou no inicio... já tenho varios clientes a ligarem-se ao servidor, só que no que diz respeito há escrita, isto corre mal. A minha aplicação começa a usar cada vez mais memoria até q fica tudo encravado, qd meto 2 clientes a escrever. a idei era receber a informação que cada um dos clientes envia, e o ip do mesmo. para depois responder para o local correcto. o codigo que tenho é o seguinte. Public Shared iplist As Hashtable Sub servir() cont = 0 iplist = New Hashtable listen.Start() While serv = "sim" If listen.Pending = True Then cont = cont + 1 tcpcliente = listen.AcceptTcpClient stream = tcpcliente.GetStream() 'MsgBox(tcpcliente.Client.RemoteEndPoint.ToString) iplist.Add(cont, tcpcliente.Client.RemoteEndPoint.ToString) Invoke(New importtxt(AddressOf enviartxt), cont) End If If cont > 0 Then recebe = "sim" startleitura() End If End While End Sub Sub receber() While recebe = "sim" Dim bytes(tcpcliente.ReceiveBufferSize) As Byte stream.Read(bytes, 0, bytes.Length) dados = Encoding.UTF8.GetString(bytes) If dados <> "" Then Invoke(New importtxt2(AddressOf escreverform), dados) End While End Sub os sub servir e receber estão a correr dentro de thread's Se conseguir por isto a dar acredito que daki a uns dias esteja a por o meu jogo na secção dos projectos pessoais... embora esteja lá um do mesmo estilo... mas existem diferenças. Link to comment Share on other sites More sharing options...
TheDark Posted September 24, 2006 at 04:49 PM Report Share #52396 Posted September 24, 2006 at 04:49 PM Não vi o código muito aprofundadamente, mas há ali uma coisa... estás a fazer While recebe = "sim" mas não te vejo a alterar a variável recebe, logo isso fica a receber para sempre? Ou estás a alterá-la noutro sítio? Assim é fácil bloquear o programa. Desaparecido. Link to comment Share on other sites More sharing options...
watt Posted September 24, 2006 at 08:21 PM Author Report Share #52438 Posted September 24, 2006 at 08:21 PM tenho um botão que liga mete a variavel a "sim" e "não", mas para estar a ver se os clientes me enviam informação não tenho q ter um ciclo a verificar. Link to comment Share on other sites More sharing options...
Crack Posted September 25, 2006 at 11:08 AM Report Share #52564 Posted September 25, 2006 at 11:08 AM Não vi o código muito aprofundadamente, mas há ali uma coisa... estás a fazer While recebe = "sim" mas não te vejo a alterar a variável recebe, logo isso fica a receber para sempre? Ou estás a alterá-la noutro sítio? Assim é fácil bloquear o programa. Aquilo ali são thread o programa nunca fica bloquiado com ciclos infinitos Dim hash as New hastable Dim ThrReceive As New Thread(AddressOf Receive) Private Sub Receive() While (1) Dim x As DictionaryEntry For Each x In hash tcpClient = x.Value Try networkStream = tcpClient.GetStream() If networkStream.DataAvailable And networkStream.CanRead Then While (tcpClient.Available > 0) bCount = networkStream.Read(bytes, 0, tcpClient.Available) ClientData = Encoding.ASCII.GetString(bytes, 0, bCount) End While Message.Invoke(Nothing) End If Catch ex As Exception TcpHash.Remove(x.Key) Exit For End Try Next If tcpListener.Pending Then Dim newClient As TcpClient newClient = tcpListener.AcceptTcpClient Dim GuidID As Guid = Guid.NewGuid TcpHash.Add(GuidID.ToString, newClient) End If ThrReceive.Sleep(100) End While End Sub Basicamente o que isto faz: no If tcpListener.Pending guarda todos os utilizadores que entrarem num hastable no For, tenta (no Try) ver se algum utilizador enviou dados Link to comment Share on other sites More sharing options...
TheDark Posted September 25, 2006 at 01:15 PM Report Share #52588 Posted September 25, 2006 at 01:15 PM Aquilo ali são thread o programa nunca fica bloquiado com ciclos infinitos Se nunca saíres dos ciclos, e por cada utilizador criares uma thread que fica presa no ciclo, eventualmente tens uma data de ciclos a correr simultaneamente (salvo seja). Ou seja, o ciclo principal do programa realmente não bloqueia, mas os threads bloqueiam. Pelos sintomas que ele descreve, lembrei-me imediatamente disso. Mas como os meus conhecimentos de Basic são básicos... pode estar-me a escapar qualquer coisa. Desaparecido. Link to comment Share on other sites More sharing options...
Crack Posted September 25, 2006 at 01:51 PM Report Share #52605 Posted September 25, 2006 at 01:51 PM só é perciso uma thread, e o Sleep(100) faz com que o programa nao fique "saturado" Link to comment Share on other sites More sharing options...
TheDark Posted September 25, 2006 at 04:43 PM Report Share #52658 Posted September 25, 2006 at 04:43 PM Mas se só precisas de uma thread, porque é que estás a criar uma nova? Desaparecido. Link to comment Share on other sites More sharing options...
Crack Posted September 25, 2006 at 04:57 PM Report Share #52662 Posted September 25, 2006 at 04:57 PM secalhar não me expliquei bem se ele tiver um botão para fazer Connect, ele vai dizer ThrReceive.Start e a thread inicia apartir dai depois de iniciada ela fica em ciclo, a thread é so uma e ela nunca chega acabar, e não pode acabar porque ta constantemente a verificar se a utilizador para entrar ou para receber dados...so acaba se ele depois num botão de Disconnect fizer ThrReceive.Abort. Link to comment Share on other sites More sharing options...
watt Posted October 3, 2006 at 01:39 PM Author Report Share #54824 Posted October 3, 2006 at 01:39 PM alguem me sabe dizer porquê é que estou sempre a perder dados na stream ?? é que estou a ter montes de problemas na comunicação, entre servidor e cliente. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now