Last active
August 29, 2015 14:03
-
-
Save cyphre/cea23da299e8ffce24e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
REBOL [ | |
title: "Example simple TCP client<->server data transfer" | |
author: ["Richard Smolak" "Andreas Bolka"] | |
] | |
;enable for verbose mode | |
debug: none ;:print | |
;lenght in bytes of test data we transfer | |
data-len: 10'000'000 | |
;transfer data chunk value | |
chunk-len: 32'000 | |
last-len: 0 | |
t0: none | |
ports: copy [] | |
if any [none? system/options/args find system/options/args "server"] [ | |
print ";; Starting server" | |
s: open tcp://:8080 | |
use [s-len s-data][ | |
s/awake: func [event /local con] [ | |
debug ['server event/type] | |
if event/type = 'accept [ | |
con: first event/port | |
con/awake: func [event /local port data len] [ | |
debug ['server-connection event/type] | |
port: event/port | |
switch event/type [ | |
read [ | |
data: port/data | |
len: length? data | |
debug ["server received" len "of" data-len "bytes (" len - last-len ")"] | |
last-len: len | |
either len < data-len [ | |
read port | |
][ | |
print "All data transferred to server succesfully" | |
s-data: copy data | |
clear port/data | |
print "Server WRITE BEGIN" | |
s-len: 0 | |
last-len: 0 | |
t0: stats/timer | |
write port take/part s-data chunk-len | |
] | |
] | |
wrote [ | |
s-len: s-len + chunk-len | |
either s-len < data-len [ | |
write port take/part s-data chunk-len | |
][ | |
print ["Server WRITE END" stats/timer - t0] | |
close port | |
return true | |
] | |
] | |
close [ | |
close port | |
return true | |
] | |
] | |
false | |
] | |
read con | |
] | |
false | |
] | |
] | |
append ports s | |
] | |
if any [none? system/options/args find system/options/args "client"] [ | |
print ";; Starting client" | |
c: open tcp://127.0.0.1:8080 | |
use [c-len c-data][ | |
c-data: head insert/dup #{} 0 data-len | |
c/awake: func [event /local port data len] [ | |
debug ['client event/type] | |
port: event/port | |
switch event/type [ | |
read [ | |
data: port/data | |
len: length? data | |
debug ["client received" len "of" data-len "bytes (" len - last-len ")"] | |
last-len: len | |
either len < data-len [ | |
read port | |
][ | |
print "All data transferred back to client succesfully" | |
data: copy data | |
clear port/data | |
;finish | |
close port | |
return true | |
] | |
] | |
wrote [ | |
c-len: c-len + chunk-len | |
either c-len < data-len [ | |
write port take/part c-data chunk-len | |
][ | |
print ["Client WRITE END" stats/timer - t0] | |
read port | |
] | |
] | |
close [ | |
close port | |
return true | |
] | |
lookup [open port] | |
connect [ | |
print "Client WRITE BEGIN" | |
c-len: 0 | |
last-len: 0 | |
t0: stats/timer | |
write port take/part c-data chunk-len | |
] | |
] | |
false | |
] | |
] | |
append ports c | |
] | |
wait ports | |
halt |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment