Firefox делает это следующим образом: первый экземпляр создает файл сокета (или именованный канал в Windows). Это служит как способом для следующих экземпляров Firefox обнаружить и связаться с первым экземпляром, так и переслать ему URL-адрес перед смертью. Файл сокета или именованный канал доступны только для процессов, работающих в локальной системе (как файлы), никакой сетевой клиент не может иметь к нему доступ. Поскольку они являются файлами, брандмауэры также не будут их блокировать (это похоже на запись в файл).
Вот наивная реализация, иллюстрирующая мою точку зрения. При первом запуске создается файл сокета lock.sock
. Дальнейшие запуски скрипта обнаружат блокировку и отправят на нее URL:
import socket
import os
SOCKET_FILENAME = 'lock.sock'
def server():
print 'I\'m the server, creating the socket'
s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
s.bind(SOCKET_FILENAME)
try:
while True:
print 'Got a URL: %s' % s.recv(65536)
except KeyboardInterrupt, exc:
print 'Quitting, removing the socket file'
s.close
os.remove(SOCKET_FILENAME)
def client():
print 'I\'m the client, opening the socket'
s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
s.connect(SOCKET_FILENAME)
s.send('http://stackoverflow.com')
s.close()
def main():
if os.path.exists(SOCKET_FILENAME):
try:
client()
except (socket.error):
print "Bad socket file, program closed unexpectedly?"
os.remove(SOCKET_FILENAME)
server()
else:
server()
main()
Вы должны реализовать правильный протокол (например, отправлять правильные дейтаграммы вместо жесткого кодирования длины), возможно, используя SocketServer , но это за пределами этого вопроса. Python Socket Programming Howto также может помочь вам. У меня нет компьютера с Windows, поэтому я не могу подтвердить, что он работает на этой платформе.