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.
Powered by vBulletin® Version 4.1.10 Copyright © 2012 vBulletin Solutions, Inc. All rights reserved.