![]() |
|
#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'
|
![]() |
|
|
Similar Threads
|
||||
| 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 |