diff --git a/lldb/tools/lldb-server/Acceptor.cpp b/lldb/tools/lldb-server/Acceptor.cpp
index c3cea7f..dd32d18 100644
--- a/lldb/tools/lldb-server/Acceptor.cpp
+++ b/lldb/tools/lldb-server/Acceptor.cpp
@@ -14,13 +14,44 @@
 #include "lldb/Core/StreamString.h"
 #include "lldb/Host/ConnectionFileDescriptor.h"
 #include "lldb/Host/common/TCPSocket.h"
-#include "lldb/Host/posix/DomainSocket.h"
+
+#include "Utility/UriParser.h"
 
 using namespace lldb;
 using namespace lldb_private;
 using namespace lldb_private::lldb_server;
 using namespace llvm;
 
+namespace {
+
+struct SocketScheme
+{
+    const char* m_scheme;
+    const Socket::SocketProtocol m_protocol;
+};
+
+SocketScheme socket_schemes[] = {
+    {"tcp", Socket::ProtocolTcp},
+    {"udp", Socket::ProtocolUdp},
+    {"unix", Socket::ProtocolUnixDomain},
+    {"unix-abstract", Socket::ProtocolUnixAbstract},
+};
+
+bool FindProtocolByScheme(const char* scheme, Socket::SocketProtocol& protocol)
+{
+    for (auto s: socket_schemes)
+    {
+        if (!strcmp(s.m_scheme, scheme))
+        {
+            protocol = s.m_protocol;
+            return true;
+        }
+    }
+    return false;
+}
+
+}
+
 Error
 Acceptor::Listen(int backlog)
 {
@@ -58,32 +89,55 @@
 {
     error.Clear();
 
-    LocalSocketIdFunc local_socket_id;
-    std::unique_ptr<Socket> listener_socket = nullptr;
-    std::string host_str;
-    std::string port_str;
-    int32_t port = INT32_MIN;
-    if (Socket::DecodeHostAndPort (name, host_str, port_str, port, &error))
+    Socket::SocketProtocol socket_protocol = Socket::ProtocolUnixDomain;
+    int port;
+    std::string scheme, host, path;
+    // Try to match socket name as URL - e.g., tcp://localhost:5555
+    if (UriParser::Parse(name.str(), scheme, host, port, path))
     {
-        auto tcp_socket = new TCPSocket(child_processes_inherit, error);
-        local_socket_id = [tcp_socket]() {
-            auto local_port = tcp_socket->GetLocalPortNumber();
-            return (local_port != 0) ? std::to_string(local_port) : "";
-        };
-        listener_socket.reset(tcp_socket);
+        if (!FindProtocolByScheme(scheme.c_str(), socket_protocol))
+            error.SetErrorStringWithFormat("Unknown protocol scheme \"%s\"", scheme.c_str());
+        else
+            name = name.drop_front(scheme.size() + strlen("://"));
     }
     else
     {
-        const std::string socket_name = name;
-        local_socket_id = [socket_name](){
-            return socket_name;
-        };
-        listener_socket.reset(new DomainSocket(child_processes_inherit, error));
+        std::string host_str;
+        std::string port_str;
+        int32_t port = INT32_MIN;
+        // Try to match socket name as $host:port - e.g., localhost:5555
+        if (Socket::DecodeHostAndPort (name, host_str, port_str, port, nullptr))
+            socket_protocol = Socket::ProtocolTcp;
     }
 
+    if (error.Fail())
+        return std::unique_ptr<Acceptor>();
+
+    std::unique_ptr<Socket> listener_socket_up = Socket::Create(
+        socket_protocol, child_processes_inherit, error);
+
+    LocalSocketIdFunc local_socket_id;
     if (error.Success())
+    {
+        if (listener_socket_up->GetSocketProtocol() == Socket::ProtocolTcp)
+        {
+            TCPSocket* tcp_socket = static_cast<TCPSocket*>(listener_socket_up.get());
+            local_socket_id = [tcp_socket]() {
+                auto local_port = tcp_socket->GetLocalPortNumber();
+                return (local_port != 0) ? std::to_string(local_port) : "";
+            };
+        }
+        else
+        {
+            const std::string socket_name = name;
+            local_socket_id = [socket_name](){
+                return socket_name;
+            };
+        }
+
         return std::unique_ptr<Acceptor>(
-            new Acceptor(std::move(listener_socket), name, local_socket_id));
+            new Acceptor(std::move(listener_socket_up), name, local_socket_id));
+    }
 
     return std::unique_ptr<Acceptor>();
 }
