Fork me on GitHub

TCP/IP Client (derived from C# to X++) [AX2012]


TCP/IP Client based on an example in my C# code. This example demonstrates how to send a string to TCP/IP Server and receive response back from it. The response is being read in batches.

The solution can be easily converted to Inbound Service.

Service data contract attribute

class YourDataContract
    str TCPResponse;

Service data member attribute

public str parmTCPResponse(str _TCPResponse = TCPResponse)
    TCPResponse = _TCPResponse;
    return TCPResponse;

Class declaration

class YourClass
    YourDataContract                    dataContract;

    System.Net.Sockets.TcpClient        tcpClient;
    System.Net.Sockets.NetworkStream    networkStream;
    System.Byte[]                       data;
    System.TimeSpan                     maxDuration;
    System.Diagnostics.Stopwatch        sw;
    boolean                             finished;
    int                                 numberOfBytesRead;
    str                                 rb;
    System.IO.IOException               ioException;
    System.Text.Encoding                ascii;

    System.Text.StringBuilder           completeResponse;
    str                                 completeString;


public YourDataContract connect(str _server, int _port, str _message)
    dataContract = new YourDataContract();
    completeResponse = new System.Text.StringBuilder();

    // Create a TcpClient.
    tcpClient = new System.Net.Sockets.TcpClient(_server, _port);

    // Set the time-out for synchronous receive methods

    // Get a client stream for reading and writing.
    networkStream = tcpClient.GetStream();

    // Translate the passed message into ASCII and store it as a Byte array.
    ascii = System.Text.Encoding::get_ASCII();
    data = ascii.GetBytes(_message);

    // Send the message to the connected TcpServer.
    networkStream.Write(data, 0, data.get_Length());

    //// Receive the TcpServer.response.

    // Buffer to store the response bytes.
    data = new System.Byte[1024]();

    // Will stop after 5 seconds
    maxDuration = new System.TimeSpan(5000);
    sw = new System.Diagnostics.Stopwatch();
    finished = false;

    // Incoming message may be larger than the buffer size.
            // Read the first batch of the TcpServer response bytes.
            numberOfBytesRead = networkStream.Read(data, 0, data.get_Length());
            rb = ascii.GetString(data, 0, numberOfBytesRead);
            if (sw.get_ElapsedMilliseconds() > maxDuration)
                throw Exception::Timeout;
                completeString = completeResponse.ToString();
                if (strScan(completeString, "</YourCustomeEndingTag>", 1, strLen(completeString)))
                    finished = true;
        // ToDo: Test exceptions.
        catch (Exception::CLRError)
            // ToDo: Exception needs to be updated.
            info("Caught 'Exception::CLRError'.");
            ioException = CLRInterop::getLastException();
    while (!finished);


    return dataContract;

A Job to test

static void connect(Args _args)
    YourClass yourClass = new YourClass();
    str xmlMsg = ""; // Some XML string, etc.
    str xmlResponse = ""; // String to keep response received

    xmlResponse = yourClass.connect("", 9555, xmlMsg).parmTCPResponse();

    info(strFmt("Data sent: %1, Data received: %2", xmlMsg, xmlResponse));

Comments !