Как подключиться к внешнему IP с помощью tcp?
Да, это возможно, но при соблюдении одного условия - белый IP адрес у сервера. В этом случае сервер будет доступен для всех, кто знает IP вашего сервера. Для этих целей вы так же можете использовать сторонние сервисы, например, NGROK. 
Однако, обратите внимание, что в таком случае вы работаете с url, а не с IP адресом.

Если же вы хотите, чтобы сервер был доступен только конкретным участникам, то вы можете поднять свой VPN сервер и выдать сертификаты всем, кто сможет в дальнейшем воспользоваться вашим сервером. Т.е. доступ к этой сети будет строго ограничен теми людьми, у которых есть учетные данные и сертификат. Одним из вариантов реализации такого решения может стать, например, OpenVPN.

Здесь адресация будет работать так же, как и в локальной сети
В нынешних условиях когда каждое подключение проходит через домашний роутер с NAT, нет не у кого "белого" ip-адреса(глобального, внешнего), кроме как у серверов. Даже если "белый" ip-адрес выдаётся провайдером роутеру(что не факт), то нужно сперва пробросить порт через UPnP или пользователем вручную. В последнем случае пользователь должен указать Вашей программе адрес и порт. Конечно есть ещё IPv6, но тех у кого он есть не слишком много. Есть Teredo, но включать его без спроса пользователя не стоит. Да и как любая технология основанная на STUN, работает он не всегда. Метод который работает абсолютно всегда это VPN, который будет проксировать подключения.
Кстати Ваш код очень наивен. У меня в системе есть сетевые адаптеры виртуальных машин, VPN-соединений, даже могут быть дополнительные Loopback, ну и конечно физические. В каком порядке будут выдаваться адреса всех этих адаптеров?