Довольно сложно "связаться со своим другом через Интернет", вне зависимости от структуры.
Чтобы получить доступ к чьему-либо ПК, необходимо знать IP-адрес конечного ПК. Если ПК находится за маршрутизатором, он, скорее всего, имеет частный IP-адрес, поэтому недоступен, если маршрутизатор не реализует какую-либо форму переадресации (в этом случае данный порт TCP перенаправляется на внутренний IP-адрес данного ПК). Затем необходимо настроить маршрутизатор на использование DDNS, чтобы ваш код мог попасть по IP-адресу маршрутизатора.
Итак, это возможно (используя классы, упомянутые @Bob), но не для слабонервных.
Способ, которым профессиональные программы (например, клиенты чата) делают это, имеет центральный сервер, который передает сообщения. Код, запущенный на вашем ПК и на компьютере вашего друга, отправляет сообщения на этот сервер, а не напрямую друг другу, поэтому не нужно знать IP-адрес другого. Но для того, чтобы идти по этому пути, требуется хостинг для серверного ПК.