1111#
1212# See ":help channel-demo" in Vim.
1313
14- import SocketServer
14+ from __future__ import print_function
1515import json
1616import socket
1717import sys
1818import threading
1919
20+ try :
21+ # Python 3
22+ import socketserver
23+ except ImportError :
24+ # Python 2
25+ import SocketServer as socketserver
26+
2027thesocket = None
2128
22- class ThreadedTCPRequestHandler (SocketServer .BaseRequestHandler ):
29+ class ThreadedTCPRequestHandler (socketserver .BaseRequestHandler ):
2330
2431 def handle (self ):
25- print "=== socket opened ==="
32+ print ( "=== socket opened ===" )
2633 global thesocket
2734 thesocket = self .request
2835 while True :
2936 try :
30- data = self .request .recv (4096 )
37+ data = self .request .recv (4096 ). decode ( 'utf-8' )
3138 except socket .error :
32- print "=== socket error ==="
39+ print ( "=== socket error ===" )
3340 break
3441 except IOError :
35- print "=== socket closed ==="
42+ print ( "=== socket closed ===" )
3643 break
3744 if data == '' :
38- print "=== socket closed ==="
45+ print ( "=== socket closed ===" )
3946 break
40- print "received: {}" .format (data )
47+ print ( "received: {}" .format (data ) )
4148 try :
4249 decoded = json .loads (data )
4350 except ValueError :
44- print "json decoding failed"
45- decoded = [0 , '' ]
51+ print ( "json decoding failed" )
52+ decoded = [- 1 , '' ]
4653
47- if decoded [1 ] == 'hello!' :
48- response = "got it"
49- else :
50- response = "what?"
51- encoded = json .dumps ([decoded [0 ], response ])
52- print "sending {}" .format (encoded )
53- self .request .sendall (encoded )
54+ # Send a response if the sequence number is positive.
55+ # Negative numbers are used for "eval" responses.
56+ if decoded [0 ] >= 0 :
57+ if decoded [1 ] == 'hello!' :
58+ response = "got it"
59+ else :
60+ response = "what?"
61+ encoded = json .dumps ([decoded [0 ], response ])
62+ print ("sending {}" .format (encoded ))
63+ self .request .sendall (encoded .encode ('utf-8' ))
5464 thesocket = None
5565
56- class ThreadedTCPServer (SocketServer .ThreadingMixIn , SocketServer .TCPServer ):
66+ class ThreadedTCPServer (socketserver .ThreadingMixIn , socketserver .TCPServer ):
5767 pass
5868
5969if __name__ == "__main__" :
@@ -69,19 +79,19 @@ class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
6979 # Exit the server thread when the main thread terminates
7080 server_thread .daemon = True
7181 server_thread .start ()
72- print "Server loop running in thread: " , server_thread .name
82+ print ( "Server loop running in thread: " , server_thread .name )
7383
74- print "Listening on port {}" .format (PORT )
84+ print ( "Listening on port {}" .format (PORT ) )
7585 while True :
7686 typed = sys .stdin .readline ()
7787 if "quit" in typed :
78- print "Goodbye!"
88+ print ( "Goodbye!" )
7989 break
8090 if thesocket is None :
81- print "No socket yet"
91+ print ( "No socket yet" )
8292 else :
83- print "sending {}" .format (typed )
84- thesocket .sendall (typed )
93+ print ( "sending {}" .format (typed ) )
94+ thesocket .sendall (typed . encode ( 'utf-8' ) )
8595
8696 server .shutdown ()
8797 server .server_close ()
0 commit comments