HELP / NETWORKING - Simple chat program:
Blitz3D Forums/Blitz3D Programming/HELP / NETWORKING - Simple chat program:
| ||
| Well im having trouble with the network code and this doesn't make sense to me.... but here it is anyway: (please note to test this you will need two computers!)
; my own VIVs
Global NUM_LINES = 18
Global RESX = 1280
Global RESY = 800
Graphics3D RESX,RESY,32,2
SetBuffer BackBuffer()
AppTitle("Basic TCP Example")
Global Status$
Global PortIn% = 25000
Global fntArialB = LoadFont("Arial",18,True)
Global RecMsg$
Global SndMsg$
Global PType%
Global Client%
Global ClientStrm
Global Server%
Global Join_IP$
Global Send_IP%
Global Serv_IP%
Global OpenChat%
Global global_order=1
Global Cam = CreateCamera()
PositionEntity Cam,0,00,-100
Type TXT
Field order,age,txt$,owner,ent,tex
End Type
Choice$ = Input("Host a chat server or join one? [h or j]")
If Choice = "h" Or Choice = "H" Then
Server = CreateTCPServer(PortIn) ;Server listens on 25000
;Check if Server was created
If Server <> 0 Then
AppTitle = "Server started..."
Else
AppTitle = "Error starting server."
EndIf
PType = 1 ;Player is a host!
Else
Join_IP$ = Input("Enter the ip address of host: [192.168.2.2]")
If Len(Join_IP) = 0 Then Join_IP = "192.168.2.2" ;if no ip addy is given, this is the default
Client = OpenTCPStream(Join_IP,PortIn) ;Client Listens on 25000
;Check if client connected to server
If Client <> 0 Then
AppTitle = "Client connected to "+Join_IP
Else
AppTitle = "Error starting client."
EndIf
PType = 2 ;Player is a Client!
EndIf
Color 0,255,0
SetFont fntArialB
If KeyHit(28)=1 Then
EndIf ;clear enter check
While Not KeyHit(1)
Check_Keys()
If PType = 1 Then ;Player is a server
;Check for new stream
strStrm = AcceptTCPStream(Server)
;if there is a new stream, capture the stream
If strStrm Then
ClientStrm = strStrm
Else
;if there is a captured stream check if there is a message in it
If ClientStrm <> 0
If ReadAvail(ClientStrm) Then
Send_IP = TCPStreamIP(ClientStrm) ;Get IP Address of Message Sender
RecMsg = ReadLine$(ClientStrm) ;Get the message from the stream
t.TXT = New txt
global_order=global_order+1
t\owner=0
t\txt$=RecMsg
t\age=0
t\order=global_order
EndIf
EndIf
EndIf
EndIf
If PType = 2 Then ;Player is a client
;check if there is a message in the stream
If ReadAvail(Client) Then
Send_IP = TCPStreamIP(Client) ;Get IP Address of Message Sender
RecMsg = ReadLine$(Client) ;Get the message from the stream
End If
EndIf
UpdateWorld()
RenderWorld()
If donkeykong=1
Text 10,20,"Status: "+Status
Text 10,40,"[Press any keys to type a message, return to send it]"
Text 10,60,"[Press enter to send a message, press esc to exit]"
Text 10,80,"[Client must send first message so server can capture Client Stream]"
Text 10,100,"strStrm: "+strStrm
Text 10,120,"ClienStrm: "+ClientStrm
Text 10,140,"Port: "+PortIn
Text 10,160,"PType: "+PType
EndIf
Color 0,0,255
show_all_chat()
;If RecMsg <> "" Then Text 10,340,"OTHER"+": "+RecMsg
Color 0,255,0
Text 10,RESY-50,"Type your message:"+SndMsg
Flip
Wend
If PType = 1 Then
If ClientStrm <> 0 Then
;Close Server stream and server
CloseTCPStream(ClientStrm)
CloseTCPServer(Server)
EndIf
EndIf
If PType = 2 Then CloseTCPStream(Client) ;Close client TCP Stream
ClearWorld()
End()
Function show_all_chat()
Delay 50
For ct = global_order To global_order-10 Step -1
For t.txt = Each Txt
If t\order=ct And twoD=1 Then
Color 255,255,255
If t\owner=0 Then Text 50,20*(10-(global_order-t\order)),"OTHER: "+t\txt
If t\owner=1 Then Text 50,20*(10-(global_order-t\order))," SELF: "+t\txt
EndIf
If t\ent=0 Then
If jesus = 0 Then
t\ent=CreateSprite()
t\Tex=CreateTexture(800,18)
SpriteViewMode t\ent,2
HandleSprite t\ent,-1,-1
SetBuffer TextureBuffer(t\tex)
EntityBlend t\ent,3
EntityTexture t\ent,t\tex
If t\owner=0 Then
Color 0,255,0
Text 0,0,"OTHER: "+t\txt
EndIf
If t\owner=1 Then
Color 255,255,255
Text 0,0," SELF: "+t\txt
EndIf
SetBuffer BackBuffer()
ScaleSprite t\ent,60,1.8
EndIf
EndIf
PositionEntity t\ent,-47,-25+(((global_order-t\order))*3),0
; PointEntity t\ent,cam
; PointEntity cam,t\ent
CameraZoom cam,2
If t\order<Global_order-16 Then
FreeEntity t\ent
FreeTexture t\tex
Delete t
EndIf
Next
Next
End Function
Function Check_Keys()
;Grab any keys that get pressed
TKey% = GetKey()
If TKey <> 0 And Len(SndMsg)<100 Or Tkey=8 Then
If Tkey <> 8 Then ;8 = backspace key
;convert pressed key to the actual character
TChr$ = Chr$(TKey)
;append string with last key pressed
SndMsg = SndMsg + TChr
Else
;if backspace key is hit, erase last letter of message
If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
EndIf
EndIf
;hitting enter key will send contents of sndmsg to client/server
If KeyHit(28) Then ;Enter key
t.TXT = New txt
global_order=global_order+1
t\owner=1
t\txt$=Left$(SndMsg,Len(SndMsg)-1)
t\age=0
t\order=global_order
If PType = 1 And ClientStrm <> 0 And SndMsg <> "" Then ;Player is a host, send message to client
;send message to Client
WriteLine(ClientStrm,SndMsg)
EndIf
If PType = 2 Then ;And SndMsg <> "" Then ;Player is a client, send message to server
;Send message to server
WriteLine(Client,SndMsg)
EndIf
SndMsg = "" ;message was sent, clear message to make room for a new message
OpenChat = 0
EndIf
End Function
Basically the problem is whatever machine is the "client machine" it will not accept incoming messages from the server. The server can see messages sent from the client and its own, but the client can only see the messages it has sent. I have tested it on both machines, so the problem has got to be with the code :s |
| ||
| Haha this dint work on same machine.. i fix that first.. and when we se.. i will try not to spoil al fun for you.. ikep the fix smal.. working.. Fixed part 1.. Made it work on same pc. Fixed Part 2 Some one seam to forgot to update chatt list data when recived message. also i changed display mode sens my laptop neded 2 windows opened.
; my own VIVs
;#### Hacked by Wings of fury at 2009-01-10 ###
;Hack1 at Row56 put in a local host if no ip entered.
;hack2 at Row110 made the engine update chatt list box when recive message
;The hack fixes so this program work on same machine + so message recived is displayed. note liced code. Google has patented it :)
Global NUM_LINES = 18
Global RESX = 800
Global RESY = 600
Graphics3D RESX,RESY,32,2
SetBuffer BackBuffer()
AppTitle("Basic TCP Example")
Global Status$
Global PortIn% = 25000
Global fntArialB = LoadFont("Arial",18,True)
Global RecMsg$
Global SndMsg$
Global PType%
Global Client%
Global ClientStrm
Global Server%
Global Join_IP$
Global Send_IP%
Global Serv_IP%
Global OpenChat%
Global global_order=1
Global Cam = CreateCamera()
PositionEntity Cam,0,00,-100
Type TXT
Field order,age,txt$,owner,ent,tex
End Type
Choice$ = Input("Host a chat server or join one? [h or j]")
If Choice = "h" Or Choice = "H" Then
Server = CreateTCPServer(PortIn) ;Server listens on 25000
;Check if Server was created
If Server <> 0 Then
AppTitle = "Server started..."
Else
AppTitle = "Error starting server."
EndIf
PType = 1 ;Player is a host!
Else
Join_IP$ = Input("Enter the ip address of host: [192.168.2.2]")
;###Edited by Wins 2009-01-10 ##### use local host if not set ip.. makes this work on same machine..
If Len(Join_IP) = 0 Then Join_IP = "localhost" ;if no ip addy is given, this is the default
;##################################
Client = OpenTCPStream(Join_IP,PortIn) ;Client Listens on 25000
;Check if client connected to server
If Client <> 0 Then
AppTitle = "Client connected to "+Join_IP
Else
AppTitle = "Error starting client."
EndIf
PType = 2 ;Player is a Client!
EndIf
Color 0,255,0
SetFont fntArialB
If KeyHit(28)=1 Then
EndIf ;clear enter check
While Not KeyHit(1)
Check_Keys()
If PType = 1 Then ;Player is a server
;Check for new stream
strStrm = AcceptTCPStream(Server)
;if there is a new stream, capture the stream
If strStrm Then
ClientStrm = strStrm
Else
;if there is a captured stream check if there is a message in it
If ClientStrm <> 0
If ReadAvail(ClientStrm) Then
Send_IP = TCPStreamIP(ClientStrm) ;Get IP Address of Message Sender
RecMsg = ReadLine$(ClientStrm) ;Get the message from the stream
t.TXT = New txt
global_order=global_order+1
t\owner=0
t\txt$=RecMsg
t\age=0
t\order=global_order
EndIf
EndIf
EndIf
EndIf
If PType = 2 Then ;Player is a client
;check if there is a message in the stream
If ReadAvail(Client) Then
Send_IP = TCPStreamIP(Client) ;Get IP Address of Message Sender
RecMsg = ReadLine$(Client) ;Get the message from the stream
;############# Code Added by Wings 2009-01-10 ################
If RecMsg <>"" Then
t.TXT = New txt
global_order=global_order+1
t\owner=0
t\txt$=RecMsg
t\age=0
t\order=global_order
End If
;#############################################################
End If
EndIf
UpdateWorld()
RenderWorld()
If donkeykong=1
Text 10,20,"Status: "+Status
Text 10,40,"[Press any keys to type a message, return to send it]"
Text 10,60,"[Press enter to send a message, press esc to exit]"
Text 10,80,"[Client must send first message so server can capture Client Stream]"
Text 10,100,"strStrm: "+strStrm
Text 10,120,"ClienStrm: "+ClientStrm
Text 10,140,"Port: "+PortIn
Text 10,160,"PType: "+PType
EndIf
Color 0,0,255
show_all_chat()
;If RecMsg <> "" Then Text 10,340,"OTHER"+": "+RecMsg
Color 0,255,0
Text 10,RESY-50,"Type your message:"+SndMsg
Flip
Wend
If PType = 1 Then
If ClientStrm <> 0 Then
;Close Server stream and server
CloseTCPStream(ClientStrm)
CloseTCPServer(Server)
EndIf
EndIf
If PType = 2 Then CloseTCPStream(Client) ;Close client TCP Stream
ClearWorld()
End()
Function show_all_chat()
Delay 50
For ct = global_order To global_order-10 Step -1
For t.txt = Each Txt
If t\order=ct And twoD=1 Then
Color 255,255,255
If t\owner=0 Then Text 50,20*(10-(global_order-t\order)),"OTHER: "+t\txt
If t\owner=1 Then Text 50,20*(10-(global_order-t\order))," SELF: "+t\txt
EndIf
If t\ent=0 Then
If jesus = 0 Then
t\ent=CreateSprite()
t\Tex=CreateTexture(800,18)
SpriteViewMode t\ent,2
HandleSprite t\ent,-1,-1
SetBuffer TextureBuffer(t\tex)
EntityBlend t\ent,3
EntityTexture t\ent,t\tex
If t\owner=0 Then
Color 0,255,0
Text 0,0,"OTHER: "+t\txt
EndIf
If t\owner=1 Then
Color 255,255,255
Text 0,0," SELF: "+t\txt
EndIf
SetBuffer BackBuffer()
ScaleSprite t\ent,60,1.8
EndIf
EndIf
PositionEntity t\ent,-47,-25+(((global_order-t\order))*3),0
; PointEntity t\ent,cam
; PointEntity cam,t\ent
CameraZoom cam,2
If t\order<Global_order-16 Then
FreeEntity t\ent
FreeTexture t\tex
Delete t
EndIf
Next
Next
End Function
Function Check_Keys()
;Grab any keys that get pressed
TKey% = GetKey()
If TKey <> 0 And Len(SndMsg)<100 Or Tkey=8 Then
If Tkey <> 8 Then ;8 = backspace key
;convert pressed key to the actual character
TChr$ = Chr$(TKey)
;append string with last key pressed
SndMsg = SndMsg + TChr
Else
;if backspace key is hit, erase last letter of message
If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
EndIf
EndIf
;hitting enter key will send contents of sndmsg to client/server
If KeyHit(28) Then ;Enter key
t.TXT = New txt
global_order=global_order+1
t\owner=1
t\txt$=Left$(SndMsg,Len(SndMsg)-1)
t\age=0
t\order=global_order
If PType = 1 And ClientStrm <> 0 And SndMsg <> "" Then ;Player is a host, send message to client
;send message to Client
WriteLine(ClientStrm,SndMsg)
EndIf
If PType = 2 Then ;And SndMsg <> "" Then ;Player is a client, send message to server
;Send message to server
WriteLine(Client,SndMsg)
EndIf
SndMsg = "" ;message was sent, clear message to make room for a new message
OpenChat = 0
EndIf
End Function
|