vlibrashook.py 2.85 KB
# -*- coding: utf-8 -*-

import select
import socket
import threading
import time

class client(threading.Thread):
    def __init__(self, host, port, timeout = 1):
        self.__connected = False
        self.__sock = None
        self.__exceptional = []
        self.__readable = []
        self.__writable = []
        self.__host = host
        self.__port = port
        self.__timeout = timeout
        threading.Thread.__init__(self)

    def __close(self):
        try:
            self.__sock.shutdown(1)
            self.__sock.close()
            return True
        except:
            return False

    def __create(self):
        self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # self.__sock.setblocking(1)

    def connected(self):
        return self.__connected

    def run(self):
        #if self.__connected:
        #    return
        print("Creating socket ...")
        self.__create()
        while True:
            try:
                if ((self.__readable == []) and (self.__writable == []) and (self.__exceptional == [])):
                    print("Connecting to: %s:%s ..." % (self.__host, self.__port))
                    if (self.__sock.connect_ex((self.__host, self.__port)) == 0):
                        self.__connected = True
                        print("Connected!")
                try:
                    self.__readable, self.__writable, self.__exceptional = select.select([self.__sock,], [self.__sock,], [], self.__timeout)
                except Exception as e:
                    print(e)
                if (self.__readable != []):
                    self.__connected = False
                    self.__close()
                    print("Recreating socket #1 ...")
                    self.__create()
                elif (self.__writable != []):
                    self.__connected = True
            except Exception as e:
                print(e)
            time.sleep(1)

    def send(self, msg):
        try:
            if (self.__connected):
                self.__sock.sendall(msg)
                # totalsent = 0
                # while totalsent < len(msg):
                #     sent = self.__sock.send(msg[totalsent:])
                #     if sent == 0:
                #         self.__connected = False
                #         raise
                #     totalsent = totalsent + sent
                return True
        except:
            self.__close()
            self.__create()
        return False

def main():
    v = ["self", "test"]
    cli = client("127.0.0.1", 10001)
    cli.start()
    while True:
        if (cli.connected()):
            for i in v:
                if (cli.send(i)):
                    print("Sent: %s" % (i))
                time.sleep(0.1)
        time.sleep(0.1)
    cli.join()

if __name__ == "__main__":
    main()