comparison runtime/tools/demoserver.py @ 7874:2313f1a94153 v7.4.1234

commit https://github.com/vim/vim/commit/488a130ea261f02317adc2c2ca93cc6e68cf2c23 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Feb 1 22:01:10 2016 +0100 patch 7.4.1234 Problem: Demo server only runs with Python 2. Solution: Make it run with Python 3 as well. (Ken Takata)
author Christian Brabandt <cb@256bit.org>
date Mon, 01 Feb 2016 22:15:04 +0100
parents 192ae655ac91
children bff95e0d8885
comparison
equal deleted inserted replaced
7873:e105d9205fa9 7874:2313f1a94153
9 # And you can control Vim by typing a JSON message here, e.g.: 9 # And you can control Vim by typing a JSON message here, e.g.:
10 # ["ex","echo 'hi there'"] 10 # ["ex","echo 'hi there'"]
11 # 11 #
12 # See ":help channel-demo" in Vim. 12 # See ":help channel-demo" in Vim.
13 13
14 import SocketServer 14 from __future__ import print_function
15 import json 15 import json
16 import socket 16 import socket
17 import sys 17 import sys
18 import threading 18 import threading
19 19
20 try:
21 # Python 3
22 import socketserver
23 except ImportError:
24 # Python 2
25 import SocketServer as socketserver
26
20 thesocket = None 27 thesocket = None
21 28
22 class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 29 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
23 30
24 def handle(self): 31 def handle(self):
25 print "=== socket opened ===" 32 print("=== socket opened ===")
26 global thesocket 33 global thesocket
27 thesocket = self.request 34 thesocket = self.request
28 while True: 35 while True:
29 try: 36 try:
30 data = self.request.recv(4096) 37 data = self.request.recv(4096).decode('utf-8')
31 except socket.error: 38 except socket.error:
32 print "=== socket error ===" 39 print("=== socket error ===")
33 break 40 break
34 except IOError: 41 except IOError:
35 print "=== socket closed ===" 42 print("=== socket closed ===")
36 break 43 break
37 if data == '': 44 if data == '':
38 print "=== socket closed ===" 45 print("=== socket closed ===")
39 break 46 break
40 print "received: {}".format(data) 47 print("received: {}".format(data))
41 try: 48 try:
42 decoded = json.loads(data) 49 decoded = json.loads(data)
43 except ValueError: 50 except ValueError:
44 print "json decoding failed" 51 print("json decoding failed")
45 decoded = [0, ''] 52 decoded = [-1, '']
46 53
47 if decoded[1] == 'hello!': 54 # Send a response if the sequence number is positive.
48 response = "got it" 55 # Negative numbers are used for "eval" responses.
49 else: 56 if decoded[0] >= 0:
50 response = "what?" 57 if decoded[1] == 'hello!':
51 encoded = json.dumps([decoded[0], response]) 58 response = "got it"
52 print "sending {}".format(encoded) 59 else:
53 self.request.sendall(encoded) 60 response = "what?"
61 encoded = json.dumps([decoded[0], response])
62 print("sending {}".format(encoded))
63 self.request.sendall(encoded.encode('utf-8'))
54 thesocket = None 64 thesocket = None
55 65
56 class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 66 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
57 pass 67 pass
58 68
59 if __name__ == "__main__": 69 if __name__ == "__main__":
60 HOST, PORT = "localhost", 8765 70 HOST, PORT = "localhost", 8765
61 71
67 server_thread = threading.Thread(target=server.serve_forever) 77 server_thread = threading.Thread(target=server.serve_forever)
68 78
69 # Exit the server thread when the main thread terminates 79 # Exit the server thread when the main thread terminates
70 server_thread.daemon = True 80 server_thread.daemon = True
71 server_thread.start() 81 server_thread.start()
72 print "Server loop running in thread: ", server_thread.name 82 print("Server loop running in thread: ", server_thread.name)
73 83
74 print "Listening on port {}".format(PORT) 84 print("Listening on port {}".format(PORT))
75 while True: 85 while True:
76 typed = sys.stdin.readline() 86 typed = sys.stdin.readline()
77 if "quit" in typed: 87 if "quit" in typed:
78 print "Goodbye!" 88 print("Goodbye!")
79 break 89 break
80 if thesocket is None: 90 if thesocket is None:
81 print "No socket yet" 91 print("No socket yet")
82 else: 92 else:
83 print "sending {}".format(typed) 93 print("sending {}".format(typed))
84 thesocket.sendall(typed) 94 thesocket.sendall(typed.encode('utf-8'))
85 95
86 server.shutdown() 96 server.shutdown()
87 server.server_close() 97 server.server_close()