2.12.6 Using MathLink to Communicate between Mathematica Sessions
This starts up a link on port number 5000.
MathLink connections between Mathematica sessions.
In:= link = LinkCreate["5000"]
This connects to the link on port 5000.
In:= link = LinkConnect["5000"]
This evaluates 15! and writes it to the link.
In:= LinkWrite[link, 15!]
This reads from the link, getting the 15! that was sent.
This writes data back on the link.
In:= LinkWrite[link, N[%^6]]
And this reads the data written in session B.
One use of MathLink connections between Mathematica sessions is simply as a way to transfer data without using intermediate files.
This writes the expression 2+2 without evaluating it.
Another use is as a way to dispatch different parts of a computation to different sessions.
In:= LinkWrite[link, Unevaluated[2 + 2]]
This reads the expression from the link, immediately wrapping it in Hold.
In:= LinkRead[link, Hold]
This evaluates the expression.
When you call LinkWrite, it writes an expression to the MathLink connection and immediately returns. But when you call LinkRead, it will not return until it has read a complete expression from the MathLink connection.
There is nothing waiting to be read on the link, so if LinkRead were to be called, it would block.
You can tell whether anything is ready to be read by calling LinkReadyQ[link]. If LinkReadyQ returns True, then you can safely call LinkRead and expect immediately to start reading an expression. But if LinkReadyQ returns False, then LinkRead would block until an expression for it to read had been written by a LinkWrite in your other Mathematica session.
This writes an expression to the link.
In:= LinkWrite[link, x + y]
Now there is an expression waiting to be read on the link.
LinkRead can thus be called without fear of blocking.
Ways to set up MathLink links.
MathLink can use whatever mechanism for interprogram communication your computer system supports. In setting up connections between concurrent Mathematica sessions, the most common mechanism is internet TCP ports.
Most computer systems have a few thousand possible numbered ports, some of which are typically allocated to standard system services.
You can use any of the unallocated ports for MathLink connections.
This finds an unallocated port on frog.wolfram.com.
Session on frog.wolfram.com
In:= link = LinkCreate[ ]
This connects to the port on frog.wolfram.com.
Session on toad.wolfram.com
In:= link = LinkConnect["firstname.lastname@example.org"]
This sends the current machine name over the link.
In:= LinkWrite[link, $MachineName]
This reads the expression written on toad.
Session on frog.wolfram.com
By using internet ports for MathLink connections, you can easily transfer data between Mathematica sessions on different machines. All that is needed is that an internet connection exists between the machines.
Note that because MathLink is completely system independent, the computers at each end of a MathLink connection do not have to be of the same type. MathLink nevertheless notices when they are, and optimizes data transmission in this case.