Go to the documentation of this file.00001
00002
00003
00004 """make tcp socket connection with Oculus Prime Server Application
00005 provide functions for relay of commands and messages"""
00006
00007 import socket, re, time
00008
00009
00010 host = "127.0.0.1"
00011 port = 4444
00012
00013 connected = False
00014 reconnect = False
00015
00016 sock = None
00017 sockfileIO = None
00018
00019
00020 def sendString(s):
00021 """Send single line command to server
00022
00023 s -- command to be sent
00024 """
00025
00026 global connected
00027 try:
00028 sock.sendall(s+"\r\n")
00029 except socket.error:
00030 connected = False
00031 if reconnect:
00032 waitForConnect()
00033 sendString(s)
00034
00035
00036 def waitForReplySearch(pattern):
00037 """Read all incoming messages from server, do not return until search match
00038
00039 pattern -- regular expression pattern to be searched
00040 returns first line containing match, or empty string if server shutdown
00041 blocking function
00042 """
00043
00044 global connected
00045 while True:
00046 try:
00047 servermsg = (sockfileIO.readline()).strip()
00048
00049 if re.search("<telnet> shutdown", servermsg, re.IGNORECASE):
00050 connected = False
00051 if reconnect:
00052 waitForConnect()
00053 waitForReplySearch(pattern)
00054 return
00055 else:
00056 return ""
00057
00058 if re.search(pattern, servermsg, re.IGNORECASE):
00059 break
00060 except socket.error:
00061 connected = False
00062 return ""
00063 return servermsg
00064
00065
00066 def clearIncoming():
00067 """Clear socket buffer of all incoming server messages"""
00068
00069 sock.setblocking(False)
00070 while True:
00071 try:
00072 sockfileIO.readline()
00073 except socket.error:
00074 break
00075
00076 sock.setblocking(True)
00077
00078
00079 def replyBufferSearch(pattern):
00080 """Search through unread output from server, compare to pattern, return match
00081 stops reading buffer if finds a match
00082
00083 pattern -- regular expression pattern to be searched
00084 returns: first line containing match, or empty string if search fails
00085 non blocking function
00086 """
00087
00088
00089 result = ""
00090 sock.setblocking(False)
00091 while True:
00092 try:
00093 servermsg = (sockfileIO.readline()).strip()
00094 if re.search(pattern, servermsg, re.IGNORECASE):
00095 result = servermsg
00096 break
00097 except socket.error:
00098 break
00099 sock.setblocking(True)
00100 return result
00101
00102
00103 def connect():
00104 """Make socket connection to server, blocking
00105
00106 returns: True if success, False otherwise
00107 """
00108 global sockfileIO, connected, sock
00109 connected = False
00110 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
00111 sockfileIO = None
00112
00113 try:
00114 sock.connect((host, port))
00115 except socket.error:
00116 connected = False
00117 if reconnect:
00118 waitForConnect()
00119 return True
00120 else:
00121 return False
00122 sockfileIO = sock.makefile()
00123 waitForReplySearch("^<telnet> Welcome")
00124 connected = True
00125 return True
00126
00127
00128 def waitForConnect():
00129 while not connected:
00130 time.sleep(10)
00131 connect()