Possibly this approach. Each party should run one sender and one receiver. A sender may be preceded by
while IFS= read -r message; do printf 'nickname: %s\n' "$message" |. A receiver may be piped to ts (timestamp). An approach where one socat (per party) is both a sender and a receiver is possible (e.g. UDP-DATAGRAM with both ports equal), but you will still want to use different ttys for input and output, to prevent incoming messages from interfering with what you type.