Skip to content

Instantly share code, notes, and snippets.

@bibby
Created March 12, 2014 14:59
Show Gist options
  • Save bibby/9508670 to your computer and use it in GitHub Desktop.
Save bibby/9508670 to your computer and use it in GitHub Desktop.
gd sockets.. y u no write?
extends Panel
export(String) var host = "localhost"
export(int) var port = 7777
export(bool) var autoConnect = true
var Socket = preload("socket.gd")
var socket
func _init():
socket = Socket.new()
if(autoConnect):
sockConnect()
get_node(get_path()).connect("sock.recv", self, "_receive")
connect("sock.err", self, "_err")
func _ready():
get_node("Button").connect("pressed", self, "onButtonPress")
func onButtonPress():
var node = get_node("Input")
var input = node.get_text()
node.set_text("")
socket.write(input)
func sockConnect():
socket.connect(host, port)
func sockDisconnect():
socket.disconnect()
func write(string):
socket.write(string)
func _receive(string):
print("Received ", string)
func _err(string):
print("SOCK_ERR ", string)
var socket = StreamPeerTCP.new()
var _accum = 0 # delta accumulator
var _active = false # socket intended for use
var _connected = false # socket is connected
const ERR = 1
func _ready():
set_process(true)
func _process(delta):
_readloop(delta)
###
### Server doesn't receive the string
###
func write(string):
if(_connected):
socket.write(_string_to_raw_array(string))
func connect(host, port):
_active = true
var err = socket.connect(host, port)
_connected = socket.is_connected()
return err
func disconnect():
_active = false
_connected = false
socket.disconnect()
func _readloop(delta):
if(not _active):
pass
# TODO, emit errors and data
_accum += delta
if(_accum > 1):
_accum = 0
var connected = socket.is_connected()
if(not connected):
_respond("Lost Connection", ERR)
else:
var output = socket.get_partial_data(1024)
var errCode = output[0]
var outputData = output[1]
if(errCode != 0):
_respond( "ErrCode:" + str(errCode), ERR)
else:
var outStr = outputData.get_string_from_utf8()
if(outStr != ""):
_respond( outStr, 0 )
func _respond(msg, errCode):
if(errCode == 0):
_respondOK(msg)
elif(errCode == ERR):
_respondErr(msg)
func _respondOK(msg):
emit_signal("sock.recv", msg)
func _respondErr(msg):
emit_signal("sock.err", msg)
func _string_to_raw_array(string):
var len = string.length()
var raw = RawArray()
var i=0
while(i<len):
raw.push_back( string.ord_at(i) )
i=i+1
return raw
@Krosh
Copy link

Krosh commented Mar 14, 2014

you function _string_to_raw_array is wrong. This is because first of string char is length. try this:

func _string_to_raw_array(string):
var len = string.length()
var raw = RawArray()
var i=2
raw.push_back(0)
raw.push_back(len)
while(i<len):
raw.push_back( string.ord_at(i) )
i=i+1
return raw

@sxmad
Copy link

sxmad commented Mar 19, 2014

you may modify line 19 to :
socket.put_data(_ string _ to_raw_array(string))

not have socket.write()

@zebatator
Copy link

Hi,
I have try this code but i have this error ''Attempt to connect to unexisting signal : sock.recv'
what's wrong ?
thank's

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment