Mar-12-2020, 11:11 PM
client code
Sever code
Thank you.
Frustrated noob
import threading
from pynput.keyboard import Key, Listener
import logging
import socket
import json
import time
SERVER = "Fake External IP because internet and all"
PORT = 5005
BUFF_SIZE = 4096
class MonitorKB(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.lock = threading.Lock()
self.kb_listener = Listener(
on_press=self.on_press,
on_release=self.on_release)
self.depressed_key = None
def on_press(self, key):
self.lock.acquire()
if self.depressed_key is None:
try:
self.depressed_key = key.char
except AttributeError as e:
if key == Key.esc:
return False
print(self.depressed_key)
self.lock.release()
def on_release(self, key):
self.lock.acquire()
self.depressed_key = None
print("None")
self.lock.release()
def run(self):
stop_flag = False
self.kb_listener.start()
net = Network()
while True:
# exit the loop
if not self.kb_listener.is_alive():
break
self.lock.acquire()
if self.depressed_key is not None and stop_flag:
stop_flag = False
net.send_message(self.depressed_key)
elif self.depressed_key is None and not stop_flag:
stop_flag = True
net.send_message("0") # sends a motor stop to the bot
self.lock.release()
class Network(object):
def __init__(self, server=SERVER, port=PORT):
self.server = server
self.port = port
# dont forget about blocking and non-blocking
# blocking:
# program will lose control after s.recv()
# until data is found. Blocking the program from running
# Non-blocking
# will return all data in the read buffer
# if there is not data it will return nothing and
# give control back to the program
def send_message(self, d):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect((self.server, self.port))
print("sending message")
self.s.sendall(str.encode(json.dumps(d)))
print("message sent")
def recvall_timeout_message(self, timeout = .01):
# self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# self.s.connect((self.server, self.port))
total_data = []
begin = time.time()
while True:
# print("receiving")
# if you got some data, then break after wait sec
if total_data and time.time() - begin > timeout:
break
# if you got no data at all, wait a little longer
elif time.time() - begin > timeout * 2:
break
try:
data = json.loads(self.s.recv(BUFF_SIZE).decode("utf-8"))
print(data)
if data:
total_data.append(data)
else:
time.sleep(0.1)
except:
pass
return total_data
def recvall_timeout_file(self, timeout=.01):
print(self.s)
total_data = []
begin = time.time()
while True:
# print("receiving")
# if you got some data, then break after wait sec
if total_data and time.time() - begin > timeout:
break
# if you got no data at all, wait a little longer
elif time.time() - begin > timeout * 2:
break
try:
data = self.s.recv(BUFF_SIZE)
if data:
total_data.append(data)
begin = time.time()
else:
time.sleep(0.1)
except:
pass
print("left recvall_timeout_file")
return total_data
if __name__ == "__main__":
logging.basicConfig()
monitorKB = MonitorKB()
monitorKB.start()
monitorKB.join() Sever code
import socket
import json
import time
import sys
import threading
HOST = ''
PORT = 5005
BUFF_SIZE = 4096 # bytes
class Network(object):
def __init__(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def socketConnect(self):
self.s.bind((HOST, PORT))
self.s.listen(1)
def accept(self):
self.conn, self.addr = self.s.accept()
self.conn.setblocking(True)
def send_message(self, d):
print("sending message")
print(str(d))
self.conn.sendall(str.encode(json.dumps(d)))
print("message sent")
def recvall_timeout_message(self, timeout=.5):
total_data = []
begin = time.time()
while True:
# if you got some data, then break after wait sec
if total_data and time.time() - begin > timeout:
break
# if you got no data at all, wait a little longer
elif time.time() - begin > timeout * 2:
break
try:
data = json.loads(self.conn.recv(BUFF_SIZE).decode("utf-8"))
if data:
total_data.append(data)
begin = time.time()
else:
time.sleep(0.1)
except:
print("something happened")
return total_data
class BotControl(object):
"""
Controls the wheels motors for the bot
"""
@staticmethod
def control(key_char):
if key_char == 'w':
BotControl.forwards()
elif key_char == 'a':
BotControl.left()
elif key_char == 's':
BotControl.backwards()
elif key_char == 'd':
BotControl.right()
elif key_char == 'q':
BotControl.spin_left()
elif key_char == 'e':
BotControl.spin_right()
elif key_char == "0":
BotControl.stop()
@staticmethod
def forwards():
print("Driving Forwards")
@staticmethod
def backwards():
print("Driving Backwards")
@staticmethod
def left():
print("Driving Left")
@staticmethod
def right():
print("Driving Right")
@staticmethod
def spin_right():
print("Spinning Right")
@staticmethod
def spin_left():
print("Spinning Left")
@staticmethod
def stop():
print("Stopping")
def main():
net = Network()
net.socketConnect()
while True:
net.accept()
bot_command = net.recvall_timeout_message()
BotControl.control(bot_command[0])
print(bot_command[0])
if __name__ == "__main__":
main()I have a 2 router situation. I have opened port 5005 on both routers. The router connected to the PC and the VM is open for internal and external port 5005 for the servers local IP and the router connected to that router has the port 5005 open too the router connected to the PC and VM. when i use local ip address the client can connect to the server with no issue but when i use the external ip i get no connection could be made because the target machine actively refused it. I have disabled firewall to see if that was the issue. Any help would be very helpful.Thank you.
Frustrated noob
