Make two programs communicate with each other Task:

Your task is to create two programs in different languages that can communicate one-way to each other. Your sending (tx) program will take input, for either stdin or a query, and send it along to the receiving (rx) program. Your rx program will then print out the data that it receives.

Rules:


The two programs must communicate one way from the tx to the rx side, so anything typed in tx will appear in rx.
They will be running on the same computer, in different shells/windows.
They will be running in separate instances, and you are not allowed to chain them (in bash, prog1 | prog2)
The programs must be written in different languages.
They can use any data transfer method, but you must be able to transfer ASCII text.
This is a popularity-contest, so the most up voted answer wins.

Note to voters: look for creativity!
C and PERL communicating via keyboard status lights
My friend and I got inspired by this one last night.
We use Perl for the sender program and C for the receiver.
The medium of exchange was the keybord status lights!
Three virtual signal lines were used: Caps Lock, Num Lock and Scroll lock, being used as Clock, Serial Data, and Start Of Byte signals.

The sender program pulses those keyboard lights and the receiver polls them and checks the state.  Data is sent serially as binary, in 8 bit bytes.
You can see the transmitter and receiver programs in operation, in the attached video, as well as the flashing of the lights during the transmission.
Video of operation
Source for both programs is attached. Given the question requirements, we didn't try to minimize the size like we would in a normal golfing attempt.
C Code (receiver)
#include &lt;X11/Xlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;

int main(void)
{
    Display* dpy = XOpenDisplay(&quot;:0&quot;);
    XKeyboardState x;
    char keys_return[32];
    int b = 0;
    while (1) {
        unsigned char output = 0;
        printf(&quot; \b&quot;);
        fflush(stdout);
        while (XQueryKeymap(dpy, keys_return)) //wait for start signal
            if (keys_return[9] == 64) {
                break;
            }
        for (b = 0; b &lt; 8; b++) {
            do {
                XGetKeyboardControl(dpy, &amp;x);
            } while (!(x.led_mask &amp; 1)); //wait for clock to be high
            if (x.led_mask &amp; 2)
                output |= 128;
            if (b != 7)
                output &gt;&gt;= 1;
            do {
                XGetKeyboardControl(dpy, &amp;x);
            } while ((x.led_mask &amp; 1)); //wait for clock to be low
        }
        printf(&quot;%c&quot;, output);
    }
    XCloseDisplay(dpy);
    return 0;
}

PERL code (transmitter)
use X11::Xlib ':all';
use strict;
use warnings;
use feature 'say';
use Time::HiRes qw(sleep);

use constant {
    DATA  =&gt; 77,
    START =&gt; 78,
    CLOCK =&gt; 66
};

my $display = X11::Xlib-&gt;new;

sub transmit_str {
    my ($str) = @_;
    foreach my $char ( split( //, $str ) ) {
        my $ordchar = ord($char);
        for my $i ( 0 .. 7 ) {
            for my $j ( 0 .. 1 ) {
                if ( $i == 0 ) {
                    $display-&gt;fake_key( START, !($j) );
                }
                if ( $ordchar &amp; 1 ) {
                    $display-&gt;fake_key( DATA, 1 );
                    $display-&gt;fake_key( DATA, 0 );
                }
                $display-&gt;flush;
                sleep(0.025) if(!$j);
                $display-&gt;fake_key( CLOCK, 1 );
                $display-&gt;fake_key( CLOCK, 0 );
                $display-&gt;flush;
                sleep(0.05);
            }
            $ordchar &gt;&gt;= 1;
        }
    }
}
while ( my $stdin = &lt;STDIN&gt; ) {
    transmit_str($stdin);
}