Mercurial > vim
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() |