![]() |
#1
|
|||
|
|||
![]()
Hi,
I am trying to set up automated server-client connection between the machines in our virtual reality network. Our network consists of 3 computers (MASTER, HEAD1, HEAD2). Working with the basic elements from the Vizard Help > Reference > Networking > Multi User environment works fine. But this approach needs always the master starting first, then the client, and when the master is disconnected it does not reconnect. So I was playing around a bit but ran into several issues: 1. When reading Help: the command index for <viznet:client>.connect says Return Value: None. Whereas when I look into the Reference>Networking>viznet or ..>Multi User Environment, the return value of this command is always used like in Code:
if viznet.client.connect('MASTER'): print 'connected' Code:
>>> import viz >>> import viznet >>> viznet.client.connect('MASTER') False Code:
>>> import viz >>> import viznet >>> viznet.server.start() 3. Because we already use the command successfully from script, next thing I try is putting these commands into a python script: Code:
import viz import viznet _networkMachines = ('MASTER', 'HEAD1', 'HEAD2', 'HEAD3') for machine in _networkMachines: print 'testing machine:', machine, if viznet.client.connect(machine): print ' -> connected +++' viznet.client.disconnect() # (1) else: print 'does not run a server ---' if viz.net.getName().upper() == 'HEAD1': viznet.server.start() viz.go() HEAD1: executing script & starting server and the simulation HEAD2: online being idle, not running Vizard HEAD3: not on the network MASTER: executing the script, displaying the following output result: Code:
testing machine: MASTER -> connected +++ testing machine: HEAD1 -> connected +++ testing machine: HEAD2 -> connected +++ ** ERROR: Failed to connect to 'HEAD3' testing machine: HEAD3 does not run a server --- BTW, without the line marked with (1) even HMD3 would look like connected; so it seems further that viznet.client.connect returns True when already connected, ignoring that the connection request was for another machine. If I am not doing anything wrong, then I would recommend that WorldViz changes the connect command in that it only returns true when there is indeed a connection established with the requested machine, meaning that there runs the server. And returns a couple of errors like
Any comments and/or ideas and/or solutions? Thanks, Walter |
#2
|
|||
|
|||
continued
No luck with an answer yet, so I look for a work-around myself. Extend the communication protocol with a connection-test and connect-confirm network events
Code:
import viz import viznet CONN_TEST = viznet.id("connTest") CONN_CONF = viznet.id("connConf") myName = viz.net.getName() Code:
if myName == 'HEAD1': doClient() else: doServer() viz.go() Code:
def srvrConnectTest(e): viznet.server.sendClient(e.client, CONN_CONF, server=myName) print 'connect confirmation sent' def doServer(): viznet.server.start() viz.callback(CONN_TEST, srvrConnectTest) Code:
import threading _TIMEOUT = 3.0 _myServer = None _confirmEvent = threading.Event() def clntConnectConfirm(e): _myServer = e.server print 'received confirmation from', e.server _confirmEvent.set() def doClient(): _lookfor = 'MASTER' if not viznet.client.connect(_lookfor): print _lookfor, 'does not run' else: viz.callback(CONN_CONF, clntConnectConfirm) print 'asking for connection confirmation...' viznet.client.send(CONN_TEST, client=myName) _confirmEvent.clear() _confirmEvent.wait(_TIMEOUT) print 'the server's name is', _myServer Code:
asking for connection confirmation... the server's name is None received confirmation from MASTER Thanks, Best Regards, Walter
__________________
21 is only half the truth. |
#3
|
|||
|
|||
Hi,
A couple things to note:
I'd recommend looking into the Python Twisted library. It supports much more advanced networking features. However, you can perform a blocking handshake by manually updating the network events in a while loop. Here is a minimal example: Server code: Code:
import viz import viznet viz.go() HANDSHAKE = viznet.id('ConnectHandshake') viznet.server.start() # Perform handshake with clients def onStartClient(e): viznet.server.sendClient(e.sender,HANDSHAKE) viz.callback(viznet.CLIENT_CONNECT_EVENT,onStartClient) Code:
import viz import viznet import vizact viz.go() SERVER = 'MASTER' HANDSHAKE = viznet.id('ConnectHandshake') def ConnectServer(server,timeout=2.0): d = viz.Data(connected=False) if viznet.client.connect(server): def _handshake(e): d.connected = True cb = vizact.addCallback(HANDSHAKE,_handshake) expire = viz.tick() + timeout while not d.connected and viz.tick() < expire: viz.waitTime(0.1) viz.update(viz.UPDATE_NETWORK) cb.remove() return d.connected if ConnectServer(SERVER): print 'Connected' else: print 'Not Connected' |
![]() |
|
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Connection problems from MotionBuilder to PPT | nachac | Precision Position Tracker (PPT) | 2 | 07-27-2010 08:29 AM |
problems nagivating around | ruby21 | Vizard | 2 | 05-18-2010 03:22 PM |
Problems loading WRL file | DrunkenBrit | Vizard | 2 | 01-29-2009 12:58 AM |
Problems Importing VRML Files | oscar | Vizard | 4 | 10-13-2004 05:42 PM |
Problems with lighting in 2.0 | murm | Vizard | 6 | 04-21-2004 09:59 AM |