Ответ 1
Для подключения требуется клиент и сервер.
Чтобы клиент мог отправлять данные на сервер, клиент должен иметь адрес сервера и номер порта. Аналогично, для отправки сервером данных клиенту сервер должен иметь адрес клиента и номер порта.
Связывание сокета означает назначение адреса и номера порта в сокет.
Когда вы выполните:
providerSocket.bind(new InetSocketAddress("192.168.0.1", 0));
Вы получаете ошибку Already Bound
, потому что у провайдера-провайдера уже есть адрес и номер порта, а присвоение нового номера адреса/порта недопустима. Когда ServerSocket создается, он привязан (если он не использует конструктор без параметров java.net.ServerSocket.ServerSocket()).