1*321efdd7SBram Moolenaar#!/usr/bin/python 2*321efdd7SBram Moolenaar# 3*321efdd7SBram Moolenaar# Server that will communicate with Vim through the netbeans interface. 4*321efdd7SBram Moolenaar# Used by test_netbeans.vim. 5*321efdd7SBram Moolenaar# 6*321efdd7SBram Moolenaar# This requires Python 2.6 or later. 7*321efdd7SBram Moolenaar 8*321efdd7SBram Moolenaarfrom __future__ import print_function 9*321efdd7SBram Moolenaarimport socket 10*321efdd7SBram Moolenaarimport sys 11*321efdd7SBram Moolenaarimport time 12*321efdd7SBram Moolenaarimport threading 13*321efdd7SBram Moolenaar 14*321efdd7SBram Moolenaartry: 15*321efdd7SBram Moolenaar # Python 3 16*321efdd7SBram Moolenaar import socketserver 17*321efdd7SBram Moolenaarexcept ImportError: 18*321efdd7SBram Moolenaar # Python 2 19*321efdd7SBram Moolenaar import SocketServer as socketserver 20*321efdd7SBram Moolenaar 21*321efdd7SBram Moolenaarclass ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): 22*321efdd7SBram Moolenaar 23*321efdd7SBram Moolenaar def handle(self): 24*321efdd7SBram Moolenaar print("=== socket opened ===") 25*321efdd7SBram Moolenaar while True: 26*321efdd7SBram Moolenaar try: 27*321efdd7SBram Moolenaar received = self.request.recv(4096).decode('utf-8') 28*321efdd7SBram Moolenaar except socket.error: 29*321efdd7SBram Moolenaar print("=== socket error ===") 30*321efdd7SBram Moolenaar break 31*321efdd7SBram Moolenaar except IOError: 32*321efdd7SBram Moolenaar print("=== socket closed ===") 33*321efdd7SBram Moolenaar break 34*321efdd7SBram Moolenaar if received == '': 35*321efdd7SBram Moolenaar print("=== socket closed ===") 36*321efdd7SBram Moolenaar break 37*321efdd7SBram Moolenaar print("received: {0}".format(received)) 38*321efdd7SBram Moolenaar 39*321efdd7SBram Moolenaar # Write the received line into the file, so that the test can check 40*321efdd7SBram Moolenaar # what happened. 41*321efdd7SBram Moolenaar with open("Xnetbeans", "a") as myfile: 42*321efdd7SBram Moolenaar myfile.write(received) 43*321efdd7SBram Moolenaar 44*321efdd7SBram Moolenaar response = '' 45*321efdd7SBram Moolenaar if received.find('Makefile') > 0: 46*321efdd7SBram Moolenaar name = received.split('"')[1] 47*321efdd7SBram Moolenaar response = '5:putBufferNumber!33 "' + name + '"\n' 48*321efdd7SBram Moolenaar response += '5:setDot!1 2/19\n' 49*321efdd7SBram Moolenaar elif received.find('disconnect') > 0: 50*321efdd7SBram Moolenaar # we're done 51*321efdd7SBram Moolenaar self.server.shutdown() 52*321efdd7SBram Moolenaar return 53*321efdd7SBram Moolenaar 54*321efdd7SBram Moolenaar if len(response) > 0: 55*321efdd7SBram Moolenaar self.request.sendall(response) 56*321efdd7SBram Moolenaar # Write the respoinse into the file, so that the test can knows 57*321efdd7SBram Moolenaar # the command was sent. 58*321efdd7SBram Moolenaar with open("Xnetbeans", "a") as myfile: 59*321efdd7SBram Moolenaar myfile.write('send: ' + response) 60*321efdd7SBram Moolenaar 61*321efdd7SBram Moolenaarclass ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): 62*321efdd7SBram Moolenaar pass 63*321efdd7SBram Moolenaar 64*321efdd7SBram Moolenaardef writePortInFile(port): 65*321efdd7SBram Moolenaar # Write the port number in Xportnr, so that the test knows it. 66*321efdd7SBram Moolenaar f = open("Xportnr", "w") 67*321efdd7SBram Moolenaar f.write("{0}".format(port)) 68*321efdd7SBram Moolenaar f.close() 69*321efdd7SBram Moolenaar 70*321efdd7SBram Moolenaarif __name__ == "__main__": 71*321efdd7SBram Moolenaar HOST, PORT = "localhost", 0 72*321efdd7SBram Moolenaar 73*321efdd7SBram Moolenaar server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) 74*321efdd7SBram Moolenaar ip, port = server.server_address 75*321efdd7SBram Moolenaar 76*321efdd7SBram Moolenaar # Start a thread with the server. That thread will then start a new thread 77*321efdd7SBram Moolenaar # for each connection. 78*321efdd7SBram Moolenaar server_thread = threading.Thread(target=server.serve_forever) 79*321efdd7SBram Moolenaar server_thread.start() 80*321efdd7SBram Moolenaar 81*321efdd7SBram Moolenaar writePortInFile(port) 82*321efdd7SBram Moolenaar 83*321efdd7SBram Moolenaar print("Listening on port {0}".format(port)) 84*321efdd7SBram Moolenaar 85*321efdd7SBram Moolenaar # Main thread terminates, but the server continues running 86*321efdd7SBram Moolenaar # until server.shutdown() is called. 87*321efdd7SBram Moolenaar try: 88*321efdd7SBram Moolenaar while server_thread.isAlive(): 89*321efdd7SBram Moolenaar server_thread.join(1) 90*321efdd7SBram Moolenaar except (KeyboardInterrupt, SystemExit): 91*321efdd7SBram Moolenaar server.shutdown() 92