2016-09-23 1 views
2

exemple TCPComment arrêter le serveur TCP dans Julia?

@async begin 
    server = listen(2000) 
    while true 
    sock = accept(server) 
    println("Hello World\n") 
    end 
end 

Pour fermer la connexion, vous devez appeler la méthode close:

close(sock) 

Comment arrêter l'auditeur?

close(server) #LoadError: accept: software caused connection abort (ECONNABORTED) 
+0

Je ne peux pas reproduire cela. Faire un exemple normal (pas '@ async'), à la fois' close (sock) 'et' close (server) 'fonctionne bien (julia 0.6.0). Et avec votre exemple ci-dessus, je ne peux pas accéder au serveur et à la chaussette pour les fermer de toute façon –

+0

peut-être que vous vouliez définir le serveur et le socket * en dehors de la tâche '@ async'? –

+1

Je reçois l'erreur que vous avez décrite seulement si j'essaie de fermer le serveur sans avoir fermé le socket en premier. (ce qui est possible dans REPL si vous prenez 'server = listen (2000)' en dehors du bloc asynchrone Et puisque vous imprimez votre propre chaîne, plutôt que de lire depuis le flux, le flux ne se ferme jamais. un meilleur exemple? –

Répondre

2

Plutôt que de garder des commentaires, voici ce que je pense que vous essayiez probablement faire:

De l'REPL julia:

julia> server = listen(2000) 
Base.TCPServer(active) 

julia> @async begin 
     while true 
      sock = accept(server) 
      print(readstring(sock)) 
     end 
     end 

D'un autre terminal:

~ $ nc localhost 2000 
Hello from the other terminal 
[Ctrl-D] % i.e. signal end of file. this closes the connection 

Dans le julia repl, vous verrez "Bonjour de l'autre terminal" imprimé dès que vous envoyez le signal EOF, mais sinon l'invite julia continuera comme d'habitude. Si vous répétez ce processus à partir du terminal netcat, vous verrez à nouveau le message imprimé dans le REPL, car le socket continue de se réactiver dans la boucle while.

Idéalement, si vous voulez fermer le tout, vous devez d'abord close(sock) puis close(server). Mais, vous ne pouvez pas fermer le socket directement, car il est dans la boucle "while" et il continue à être réactivé, et vous n'avez pas directement accès à la variable "sock".

Par conséquent, vous ne pouvez fermer le serveur qu'en attendant une erreur. attraper donc dans un bloc d'essai à la place

EDIT: désolé, mon mauvais, l'exception se rapporte à la prise, pas le serveur, vous devez donc envelopper que dans un bloc catch try dans votre bloc async à la place :

@async begin 
    while true 
     try 
     sock = accept(server) 
     print(readstring(sock)) 
     catch ex 
     print("exiting while loop") 
     break 
     end 
    end 
    end