%% Communicate Binary and ASCII Data to an Echo Server Using TCP/IP
% This example shows how to set up an echo server and communicate with it using TCP/IP by creating a tcpclient object. Binary data and terminated string data are sent to the server and the server echoes the same data back to the client.
%
%% Set Up TCP/IP Echo Server and Client
% Create a TCP/IP echo server on port 4500.

echotcpip("on",4500);

% Create a tcpclient object and connect to the server. Specify the remote host as "localhost" to connect to the echo server. Specify the same remote port number you used for the echo server.

t = tcpclient("localhost",4500)

%
%% Write and Read Binary Data Using Byte Callback Mode
% Create a callback function called readDataFcn to read data each time the specified bytes of data are available. Store the read data in the UserData property of tcpclient object. See the readDataFcn function at the end of this example.
% Set the callback function to trigger each time 10 bytes of data are received.

configureCallback(t,"byte",10,@readDataFcn);

% Send 10 bytes of data to the echo server.

sendData = 1:10;
write(t,sendData,"uint8");

% The echo server sends the binary data back to the TCP/IP client.
% Pause for 1 second to allow the callback function readDataFcn to complete its operation.

pause(1);

% Read binary data stored in UserData property and display it.

data = t.UserData

% This data matches the data you wrote to the echo server.
%
%% Write and Read ASCII Data Using Terminator Callback Mode
% Create a callback function called readASCIIFcn to read data each time a terminator is found in the data. Store the read data in the UserData property of tcpclient object. See the readASCIIFcn function at the end of this example.
% Set the callback function to read terminated string data. The callback is triggered when it receives a terminator in the data.

configureCallback(t,"terminator",@readASCIIFcn);

% Set the Terminator property value to "LF".

configureTerminator(t,"LF");

% Send string data to the echo server using writeline. The terminator character "LF" is automatically appended to this string data.

writeline(t,"Echo this string.");

% The echo server sends the ASCII data back to the TCP/IP client.
% Pause for 1 second to allow the callback function readASCIIFcn to complete its operation.

pause(1);

% Read ASCII data stored in UserData property and display it.

textData = t.UserData

% This data matches the data you wrote to the echo server.
%
%% Clear the Connection
% Stop the echo server and clear the tcpclient object.

echotcpip("off");
clear t

%
%% Callback Functions
%% Callback Function to Read Binary Data
% This function calls read to read BytesAvailableFcnCount number of bytes of data. This data is echoed back by the server.

function readDataFcn(src, ~)
src.UserData = read(src,src.BytesAvailableFcnCount,"uint8");
end

%% Callback Function to Read ASCII Data
% This function calls readline to read ASCII data originally sent by the tcpclient object. The data is echoed back by the server.

function readASCIIFcn(src, ~)
src.UserData = readline(src);
end

% Copyright 2020 The MathWorks, Inc.