SocketOpen

SocketOpen[port]

opens a socket that accepts TCP connections to localhost:port and returns a SocketObject representing the socket.

SocketOpen[address]

opens a socket that accepts TCP connections to the specified local address.

SocketOpen[address,"protocol"]

opens a socket that accepts connections with the specified protocol.

SocketOpen[address,{"protocol","type"}]

opens a socket that accepts connections of the specified protocol and type.

Details

  • Supported protocols include:
  • "TCP"raw TCP stream protocol
    "ZMQ"ZeroMQ one-to-one message protocol
    {"ZMQ","type"}ZeroMQ protocol of the specified type
  • For ZMQ sockets, possible types include:
  • "Pair"socket that can send/receive with exactly one client peer
    "Publish"socket that sends messages out to all connected clients
    "Subscribe"socket that receives messages from a publisher socket
    "Request"socket to send request messages to a corresponding reply socket and receive response messages
    "Reply"socket to receive request messages from a corresponding "Request" socket and send response messages back
    "Dealer"same as "Request" socket except sent messages are delivered in round-robin style to all connected clients
    "Router"same as "Reply" socket except messages are received in fair-queueing style from all connected clients and maintains routing information
    "Pull"socket for pipeline topologies to receive messages
    "Push"socket for pipeline topologies to send messages
    "XPublish"same as "Publish", but received messages on this socket are subscriptions
    "XSubscribe"same as "Subscribe", but messages sent over this socket are used as subscriptions to the corresponding "XPublish" socket
    "Stream"socket for connecting a ZMQ socket to non-ZMQ TCP sockets
  • With no ZMQ protocol type specified, the underlying socket is a {"ZMQ","Pair"} socket.
  • SocketOpen opens sockets only on your local machine.
  • SocketOpen can use local addresses only. Possible forms include:
  • {host,port}local hostname or IP address and port number
    {host,"service"}local hostname or IP address and service name
    "host:port"local hostname or IP address with port
    {host,Automatic}an available port on the specified host
    Automatican available port on localhost
  • Hostnames have forms like "www.wolfram.com".
  • IP addresses can be given as "140.177.0.0" or IPAddress[string], where string is an IPv4 or IPv6 IP address.
  • SocketConnect can be used to connect to sockets opened by SocketOpen. The fact that a socket is open on one machine does not guarantee that another machine can connect to it.
  • For a connection to be established, the protocol must be consistent, and there must be no firewalls etc. blocking it.
  • Information on how to use the different ZMQ socket types can be found in the ZeroMQ documentation.
  • Close can be used to close a connection opened by SocketOpen.

Examples

open allclose all

Basic Examples  (2)

Open a socket to allow client connections to it:

Connect a client to it:

Close the sockets:

Open a ZMQ socket:

Connect a client to the server:

Write a message from the client to the server:

Read the message on the server:

Close the sockets:

Scope  (3)

After clients have connected to an opened TCP socket, the clients can each be accessed as a SocketObject with the property "ConnectedClients".

Open a server socket to allow connections, and connect a client to the socket:

List the client sockets from the server's perspective:

These sockets also show up as remote sockets with Sockets:

Close the sockets:

Open a server socket on a specified IP address:

Open a server socket on a specified port:

Close the sockets:

Open a ZMQ socket of type "Push", which can be used for a one-way message pipeline:

Connect with a "Pull" socket type:

Write a message on the "Push" socket:

Read the message on the "Pull" socket:

Close the sockets:

Applications  (1)

Implement a web server in the Wolfram Language with SocketOpen.

Start listening on a TCP port:

Initially there are no connected clients:

Connect to a the server from a web browser:

Now there is at least one client from the web browser:

Write a generic response to all clients:

Finally, close the server and the connections to the clients:

Possible Issues  (1)

Writing on a socket returned from SocketOpen only works for ZMQ sockets; for TCP sockets, you must use the "ConnectedClients" property.

Open a TCP and a ZMQ socket and connect clients:

Writing on the TCP socket fails because you have to write to a specific client:

In contrast, writing to a ZMQ socket directly works:

Close all the sockets:

Introduced in 2017
 (11.2)
 |
Updated in 2020
 (12.1)