PDA

View Full Version : XMLsocket onData problems



Sirisian
April 21st, 2007, 09:16 AM
I can't seem to figure this out. I've read about the scoping problems. I've seen senocular's tutorial even. However, I can't seem to figure out what's wrong with this implementation.
*Note: I don't use XML, so I prototyped the onData to get rid of the XML parsing part.

If you could help me fix this I would be very grateful. I've been looking at it and testing it for like two days now.

class NetworkingManager {

public var mySocket:XMLSocket;
function NetworkingManager() {
//variable to access this while inside an event
var nmObj:NetworkingManager = this;
this.mySocket = new XMLSocket();
this.mySocket.connect("localhost", 3333);

this.mySocket.onConnect = function(success) {
if (success) {
trace("Server connection established!");
} else {
trace("Server connection failed!");
}
nmObj.printData("HERE IN THE ON CONNECT")
};

this.mySocket.onClose = function() {
trace("Server connection lost");
};

this.mySocket.prototype.onData = function(msg:String):Void {
trace("DATA"+msg);
nmObj.printData(msg);
};

}
public function Ping():Void {
mySocket.send("ping");
}
public function printData(msg:String):Void {
trace("DATA: "+msg);
}
}

Sirisian
April 22nd, 2007, 12:24 PM
I tested my server today and created a client program in a different language and I had my server ping with the string "ping" then a zero at the end and that client worked perfectly. But for some reason flash won't. Is there something I have to do so that flash can receive data? I mean it can send packet out to my server already. Then when I try to send packet from my server to flash they never make it there. (I added the extra null byte onto the end).

This is really frustrating and I think I ran out of things to test. Have any of you guys tried this before?

Here's my server code if it helps. It's in VB.NET


Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Public Class frmServer
Delegate Sub AddListItem(ByVal entry As String)
Public myDelegate As AddListItem = New AddListItem(AddressOf WriteToLog)
Public maxPlayers As Integer = 20
Public buffer(1024) As Byte
Public listeningSocket As New System.Net.Sockets.Socket(System.Net.Sockets.Addre ssFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
Public players As New List(Of PlayerData)

Public Sub WriteToLog(ByVal entry As String)
Me.serverLog.Items.Add(entry)
End Sub
Public Sub Request(ByVal AR As IAsyncResult)
For playerItr As Integer = 0 To maxPlayers
If players(playerItr).occupied = False Then
Try

Try

Dim pSocket As System.Net.Sockets.Socket = CType(AR.AsyncState, System.Net.Sockets.Socket)
players(playerItr).Socket = pSocket.EndAccept(AR)
players(playerItr).Socket.NoDelay = True

Catch
'Print an error to show that the end accept call on the players socket failed
Me.Invoke(Me.myDelegate, New Object() {"ERROR ENDACCEPT"})
Exit Sub
End Try


Try
players(playerItr).BeginReceive()
Catch

'Print an error to show that the begin receive call on the players socket failed
Me.Invoke(Me.myDelegate, New Object() {"ERROR BEGINRECEIVE"})
Exit Sub

End Try

Try
listeningSocket.BeginAccept(AddressOf Request, listeningSocket)
Catch
'Print an error to show that the begin accept call on the players socket failed
Me.Invoke(Me.myDelegate, New Object() {"ERROR BEGINACCEPT2"})
Exit Sub
End Try

Catch

'Print that there was an error that was undetected by the rest of the catch statements
Me.Invoke(Me.myDelegate, New Object() {"ERROR ENDACCEPT FUNCTION"})
Exit Sub

End Try

'No errors detected connect the new player to a socket
players(playerItr).occupied = True
Me.Invoke(Me.myDelegate, New Object() {"Connection"})

Exit For
End If
Next
End Sub
Private Sub frmServer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim listeningEndPoint As New IPEndPoint(System.Net.IPAddress.Any, 3333)
listeningSocket.Bind(listeningEndPoint)
listeningSocket.Listen(10)
Try
listeningSocket.BeginAccept(New AsyncCallback(AddressOf Request), listeningSocket)
Catch
WriteToLog("ERROR BEGINACCEPT")
End Try
For playerItr As Integer = 0 To maxPlayers
players.Add(New PlayerData(Me))
players(playerItr).occupied = False
Next
End Sub

Private Sub pingClients_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pingClients.Click
Dim ASCII As New System.Text.ASCIIEncoding()
For playerItr As Integer = 0 To maxPlayers

If players(playerItr).occupied Then

Dim bytes() As Byte = ASCII.GetBytes("ping")
'Redim the array to add a null byte to the end
ReDim Preserve bytes(bytes.Length)
Try
players(playerItr).Send(bytes)
Catch
WriteToLog("ERROR BEGINSEND")
End Try

End If

Next
End Sub

Private Sub gameLoop_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles gameLoop.Tick
Dim numberOfPlayers As Integer = 0
For playerItr As Integer = 0 To maxPlayers
If players(playerItr).occupied Then
numberOfPlayers += 1
End If
Next
txtNumberOfPlayers.Text = numberOfPlayers
End Sub
End Class

Then for the playerData stateObject

Public Class PlayerData
Public occupied As Boolean
Public Socket As New System.Net.Sockets.Socket(System.Net.Sockets.Addre ssFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
Public buffer() As Byte
Public Size As Integer = 1024
Private serverForm As frmServer

Sub New(ByVal serverForm1 As frmServer)
ReDim buffer(1024)
serverForm = serverForm1
End Sub

Public Sub ResetPlayerData()
occupied = False
Socket.Close()
End Sub

Public Sub BeginReceive()
Socket.BeginReceive( _
buffer, _
0, _
buffer.Length, _
0, _
AddressOf EndReceiveData, _
Me)
End Sub

Public Sub ReceiveData()
If Socket.Connected() Then

Dim ASCII As New System.Text.ASCIIEncoding()
'frmServer.serverLog.Items.Add("DATA: " & ASCII.GetChars(buffer))

Try
'Dim State As PlayerData = CType(ar, PlayerData)
Socket.BeginReceive(buffer, 0, buffer.Length, 0, AddressOf EndReceiveData, Me)
Catch
serverForm.Invoke(serverForm.myDelegate, New Object() {New String("ERROR BEGINRECEIVEData")})
End Try

serverForm.Invoke(serverForm.myDelegate, New Object() {"RECEIVE SUCCESS"})

Else

ResetPlayerData()
serverForm.Invoke(serverForm.myDelegate, New Object() {"Socket Was Not Connected"})
Exit Sub

End If

End Sub

Public Sub EndReceiveData(ByVal AR As IAsyncResult)
Dim state As PlayerData = CType(AR.AsyncState, PlayerData)
If state.Socket.Connected() Then

Try

Dim Length As Integer = state.Socket.EndReceive(AR)
Dim data As String = System.Text.Encoding.ASCII.GetString(state.buffer, 0, Length)
If data = "" Then
state.ResetPlayerData()
serverForm.Invoke(serverForm.myDelegate, New Object() {"Socket Disconnected With Null Packet"})
Exit Sub
End If
serverForm.Invoke(serverForm.myDelegate, New Object() {data})

Catch

serverForm.Invoke(serverForm.myDelegate, New Object() {"ERROR ENDRECEIVE"})
state.Socket.Close()
Exit Sub

End Try
'Call the receive data function so the socket is ready to recieve data again.
state.ReceiveData()
serverForm.Invoke(serverForm.myDelegate, New Object() {"END RECEIVE SUCCESS"})

Else

state.ResetPlayerData()
serverForm.Invoke(serverForm.myDelegate, New Object() {"Socket Was Not Connected"})
Exit Sub

End If

End Sub

Public Sub Send(ByRef data() As Byte)
Socket.BeginSend(data, 0, data.Length, 0, AddressOf EndSend, Me)
End Sub

Public Sub EndSend(ByVal AR As IAsyncResult)
Dim state As PlayerData = CType(AR.AsyncState, PlayerData)
If state.Socket.Connected() Then

Try

Dim Length As Integer = state.Socket.EndSend(AR)

serverForm.Invoke(serverForm.myDelegate, New Object() {"PingClient, Length: " & CStr(Length)})

Catch
'Print that the players socket failed to EndSend
serverForm.Invoke(serverForm.myDelegate, New Object() {"ERROR SENDING DATA"})

End Try

Else

state.ResetPlayerData()
serverForm.Invoke(serverForm.myDelegate, New Object() {"Socket Was Not Connected"})
Exit Sub

End If

serverForm.Invoke(serverForm.myDelegate, New Object() {"SEND SUCCESS"})
End Sub

End Class

Templarian
April 22nd, 2007, 06:57 PM
This seems like something senocular would know, but hes always busy.