Hello,
I'm fairly new to Croquet and was going to collaborate with another person, but we're both behind firewalls. I know, though, how to set up port forwards through an SSH tunnel, so I set up the proper listeners based on the postcards and tried to connect. I'm getting an error that I suspect may be because after the initial connection, another port-pair is being attempted to be established for communication between the two routers. My questions are related to that assumption. 1) Is there a specific range where Croquet negotiates those connections 2) Can that range be reduced or set to a specific port somewhere 3) What is the class named that handles this negotiation? We're using SimpleDemo (Master) to try to establish this connection. Thanks for any assistance, Joel Wilson |
Hi Joel -
The way the demos are set up they'll work only on a local area network since they use UDP to find other peers and assign the ports randomly. The way you describe your setup you're trying to run Croquet over a WAN configuration which (currently) requires a bit more setup than usual. First, there needs to be a machine to host the router and which will also act as the rendevouz point (this may be one of your participants or a dedicated machine outside of the firewall). Just as long as it has a port that the clients can get to it'll be fine. On that machine, you want to run... The Router Script ================= id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. dispatcher := TExampleDispatcher new. dispatcher listenOn: 4321. "fixed port" dispatcher autoCreate: false. router := TSimpleRouter new. router addUserName: 'foo' password: 'bar'. dispatcher addRouter: router id: id. The key elements in the above are: - the id: Which is some unique ID that you'll use for identifying the session - the port: That's the port the participants need to reach - the authentication info: You don't want just about everybody to get there Once the router is up and running, it's time to get to... The participant script ====================== This script is a little longer since it needs to do quite a bit of setup but it's not too horrible either: user := UIManager default request: 'Enter user name' initialAnswer:'guest'. pass := UIManager default requestPassword: 'Enter password for ', user storeString. participant := CroquetParticipant new. participant setup. harness := participant instVarNamed: 'harness'. "Eeek!" address := NetNameResolver addressForName: 'localhost'. id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. controller := TSimpleController new. controller connectTo: address port: 4321 sessionID: id. p := controller login: user password: pass. p wait. "until connected" p := controller join. "receive messages" p wait. "until joined" p := controller sync. "request replicated state" p wait. "until sync-ed" p result ifNil:[ island := controller newIsland. island future id: id name: 'Test'. sync := island future new: SimpleWorld. ] ifNotNil:[ controller install: p result. island := controller island. ]. controller beServer. "act as server" controller heartbeat: 20. "set heartbeat rate" harness addController: controller. entry := controller island future at: #masterSpace. pc := entry future postcard. pc whenResolved:[ harness addIsland: island postcard: pc value. sync := harness viewPortal future postcardLink: pc value. sync whenResolved:[ harness startRender. participant openInWorld. ]. "ready to render" ]. Obviously, you want to make sure that your credentials, the router address/port, the world to create etc. all match up. Back to your question: With the above scripts, your tunneling questions should have clear answers. Just specify any port you'd like in the above, or even better, put the router on a machine that's not behind a firewall and forget about tunneling. Cheers, - Andreas Joel Wilson wrote: > Hello, > > I'm fairly new to Croquet and was going to collaborate with another > person, but we're both behind firewalls. I know, though, how to set up > port forwards through an SSH tunnel, so I set up the proper listeners > based on the postcards and tried to connect. I'm getting an error that I > suspect may be because after the initial connection, another port-pair is > being attempted to be established for communication between the two > routers. > > My questions are related to that assumption. > > 1) Is there a specific range where Croquet negotiates those connections > 2) Can that range be reduced or set to a specific port somewhere > 3) What is the class named that handles this negotiation? > > We're using SimpleDemo (Master) to try to establish this connection. > > Thanks for any assistance, > > Joel Wilson > > > |
In reply to this post by Tangaloor
Andreas,
Thank you. Is it possible to run Smalltalk without a frame buffer? I've got a machine in mind, but it's rack mounted and has no display. -Joel > Hi Joel - > > The way the demos are set up they'll work only on a local area network > since they use UDP to find other peers and assign the ports randomly. > The way you describe your setup you're trying to run Croquet over a WAN > configuration which (currently) requires a bit more setup than usual. > > First, there needs to be a machine to host the router and which will > also act as the rendevouz point (this may be one of your participants or > a dedicated machine outside of the firewall). Just as long as it has a > port that the clients can get to it'll be fine. On that machine, you > want to run... > > The Router Script > ================= > > id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. > > dispatcher := TExampleDispatcher new. > dispatcher listenOn: 4321. "fixed port" > dispatcher autoCreate: false. > > router := TSimpleRouter new. > router addUserName: 'foo' password: 'bar'. > dispatcher addRouter: router id: id. > > The key elements in the above are: > - the id: Which is some unique ID that you'll use for identifying the > session > - the port: That's the port the participants need to reach > - the authentication info: You don't want just about everybody to get > there > > Once the router is up and running, it's time to get to... > > The participant script > ====================== > > This script is a little longer since it needs to do quite a bit of setup > but it's not too horrible either: > > > user := UIManager default > request: 'Enter user name' initialAnswer:'guest'. > pass := UIManager default > requestPassword: 'Enter password for ', user storeString. > > participant := CroquetParticipant new. > participant setup. > harness := participant instVarNamed: 'harness'. "Eeek!" > > address := NetNameResolver addressForName: 'localhost'. > id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. > > controller := TSimpleController new. > controller connectTo: address port: 4321 sessionID: id. > p := controller login: user password: pass. > p wait. "until connected" > p := controller join. "receive messages" > p wait. "until joined" > p := controller sync. "request replicated state" > p wait. "until sync-ed" > > p result ifNil:[ > island := controller newIsland. > island future id: id name: 'Test'. > sync := island future new: SimpleWorld. > ] ifNotNil:[ > controller install: p result. > island := controller island. > ]. > controller beServer. "act as server" > controller heartbeat: 20. "set heartbeat rate" > harness addController: controller. > entry := controller island future at: #masterSpace. > pc := entry future postcard. > pc whenResolved:[ > harness addIsland: island postcard: pc value. > sync := harness viewPortal future postcardLink: pc value. > sync whenResolved:[ > harness startRender. > participant openInWorld. > ]. "ready to render" > ]. > > > Obviously, you want to make sure that your credentials, the router > address/port, the world to create etc. all match up. > > Back to your question: With the above scripts, your tunneling questions > should have clear answers. Just specify any port you'd like in the > above, or even better, put the router on a machine that's not behind a > firewall and forget about tunneling. > > Cheers, > - Andreas > > Joel Wilson wrote: >> Hello, >> >> I'm fairly new to Croquet and was going to collaborate with another >> person, but we're both behind firewalls. I know, though, how to set up >> port forwards through an SSH tunnel, so I set up the proper listeners >> based on the postcards and tried to connect. I'm getting an error that I >> suspect may be because after the initial connection, another port-pair >> is >> being attempted to be established for communication between the two >> routers. >> >> My questions are related to that assumption. >> >> 1) Is there a specific range where Croquet negotiates those connections >> 2) Can that range be reduced or set to a specific port somewhere >> 3) What is the class named that handles this negotiation? >> >> We're using SimpleDemo (Master) to try to establish this connection. >> >> Thanks for any assistance, >> >> Joel Wilson >> >> >> > > |
In reply to this post by Tangaloor
Yes, no problem. Assuming you're on a Unix box, just use:
squeak -headless router.image file:///home/andreas/router.st And router.st is exactly the little script that I quoted. Cheers, - Andreas Joel Wilson wrote: > Andreas, > > Thank you. Is it possible to run Smalltalk without a frame buffer? I've > got a machine in mind, but it's rack mounted and has no display. > > -Joel > >> Hi Joel - >> >> The way the demos are set up they'll work only on a local area network >> since they use UDP to find other peers and assign the ports randomly. >> The way you describe your setup you're trying to run Croquet over a WAN >> configuration which (currently) requires a bit more setup than usual. >> >> First, there needs to be a machine to host the router and which will >> also act as the rendevouz point (this may be one of your participants or >> a dedicated machine outside of the firewall). Just as long as it has a >> port that the clients can get to it'll be fine. On that machine, you >> want to run... >> >> The Router Script >> ================= >> >> id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. >> >> dispatcher := TExampleDispatcher new. >> dispatcher listenOn: 4321. "fixed port" >> dispatcher autoCreate: false. >> >> router := TSimpleRouter new. >> router addUserName: 'foo' password: 'bar'. >> dispatcher addRouter: router id: id. >> >> The key elements in the above are: >> - the id: Which is some unique ID that you'll use for identifying the >> session >> - the port: That's the port the participants need to reach >> - the authentication info: You don't want just about everybody to get >> there >> >> Once the router is up and running, it's time to get to... >> >> The participant script >> ====================== >> >> This script is a little longer since it needs to do quite a bit of setup >> but it's not too horrible either: >> >> >> user := UIManager default >> request: 'Enter user name' initialAnswer:'guest'. >> pass := UIManager default >> requestPassword: 'Enter password for ', user storeString. >> >> participant := CroquetParticipant new. >> participant setup. >> harness := participant instVarNamed: 'harness'. "Eeek!" >> >> address := NetNameResolver addressForName: 'localhost'. >> id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. >> >> controller := TSimpleController new. >> controller connectTo: address port: 4321 sessionID: id. >> p := controller login: user password: pass. >> p wait. "until connected" >> p := controller join. "receive messages" >> p wait. "until joined" >> p := controller sync. "request replicated state" >> p wait. "until sync-ed" >> >> p result ifNil:[ >> island := controller newIsland. >> island future id: id name: 'Test'. >> sync := island future new: SimpleWorld. >> ] ifNotNil:[ >> controller install: p result. >> island := controller island. >> ]. >> controller beServer. "act as server" >> controller heartbeat: 20. "set heartbeat rate" >> harness addController: controller. >> entry := controller island future at: #masterSpace. >> pc := entry future postcard. >> pc whenResolved:[ >> harness addIsland: island postcard: pc value. >> sync := harness viewPortal future postcardLink: pc value. >> sync whenResolved:[ >> harness startRender. >> participant openInWorld. >> ]. "ready to render" >> ]. >> >> >> Obviously, you want to make sure that your credentials, the router >> address/port, the world to create etc. all match up. >> >> Back to your question: With the above scripts, your tunneling questions >> should have clear answers. Just specify any port you'd like in the >> above, or even better, put the router on a machine that's not behind a >> firewall and forget about tunneling. >> >> Cheers, >> - Andreas >> >> Joel Wilson wrote: >>> Hello, >>> >>> I'm fairly new to Croquet and was going to collaborate with another >>> person, but we're both behind firewalls. I know, though, how to set up >>> port forwards through an SSH tunnel, so I set up the proper listeners >>> based on the postcards and tried to connect. I'm getting an error that I >>> suspect may be because after the initial connection, another port-pair >>> is >>> being attempted to be established for communication between the two >>> routers. >>> >>> My questions are related to that assumption. >>> >>> 1) Is there a specific range where Croquet negotiates those connections >>> 2) Can that range be reduced or set to a specific port somewhere >>> 3) What is the class named that handles this negotiation? >>> >>> We're using SimpleDemo (Master) to try to establish this connection. >>> >>> Thanks for any assistance, >>> >>> Joel Wilson >>> >>> >>> >> > > > > |
In reply to this post by Tangaloor
Andreas,
From what I'm reading, I could potentially put a controller and an initial island in that headless image and connect to it with a trimmed down participant script. That way I could have a persistent world. Can a controller run without a viewPort? -Joel > Yes, no problem. Assuming you're on a Unix box, just use: > > squeak -headless router.image file:///home/andreas/router.st > > And router.st is exactly the little script that I quoted. > > Cheers, > - Andreas > > > Joel Wilson wrote: >> Andreas, >> >> Thank you. Is it possible to run Smalltalk without a frame buffer? >> I've >> got a machine in mind, but it's rack mounted and has no display. >> >> -Joel >> >>> Hi Joel - >>> >>> The way the demos are set up they'll work only on a local area network >>> since they use UDP to find other peers and assign the ports randomly. >>> The way you describe your setup you're trying to run Croquet over a WAN >>> configuration which (currently) requires a bit more setup than usual. >>> >>> First, there needs to be a machine to host the router and which will >>> also act as the rendevouz point (this may be one of your participants >>> or >>> a dedicated machine outside of the firewall). Just as long as it has a >>> port that the clients can get to it'll be fine. On that machine, you >>> want to run... >>> >>> The Router Script >>> ================= >>> >>> id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. >>> >>> dispatcher := TExampleDispatcher new. >>> dispatcher listenOn: 4321. "fixed port" >>> dispatcher autoCreate: false. >>> >>> router := TSimpleRouter new. >>> router addUserName: 'foo' password: 'bar'. >>> dispatcher addRouter: router id: id. >>> >>> The key elements in the above are: >>> - the id: Which is some unique ID that you'll use for identifying the >>> session >>> - the port: That's the port the participants need to reach >>> - the authentication info: You don't want just about everybody to get >>> there >>> >>> Once the router is up and running, it's time to get to... >>> >>> The participant script >>> ====================== >>> >>> This script is a little longer since it needs to do quite a bit of >>> setup >>> but it's not too horrible either: >>> >>> >>> user := UIManager default >>> request: 'Enter user name' initialAnswer:'guest'. >>> pass := UIManager default >>> requestPassword: 'Enter password for ', user storeString. >>> >>> participant := CroquetParticipant new. >>> participant setup. >>> harness := participant instVarNamed: 'harness'. "Eeek!" >>> >>> address := NetNameResolver addressForName: 'localhost'. >>> id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. >>> >>> controller := TSimpleController new. >>> controller connectTo: address port: 4321 sessionID: id. >>> p := controller login: user password: pass. >>> p wait. "until connected" >>> p := controller join. "receive messages" >>> p wait. "until joined" >>> p := controller sync. "request replicated state" >>> p wait. "until sync-ed" >>> >>> p result ifNil:[ >>> island := controller newIsland. >>> island future id: id name: 'Test'. >>> sync := island future new: SimpleWorld. >>> ] ifNotNil:[ >>> controller install: p result. >>> island := controller island. >>> ]. >>> controller beServer. "act as server" >>> controller heartbeat: 20. "set heartbeat rate" >>> harness addController: controller. >>> entry := controller island future at: #masterSpace. >>> pc := entry future postcard. >>> pc whenResolved:[ >>> harness addIsland: island postcard: pc value. >>> sync := harness viewPortal future postcardLink: pc value. >>> sync whenResolved:[ >>> harness startRender. >>> participant openInWorld. >>> ]. "ready to render" >>> ]. >>> >>> >>> Obviously, you want to make sure that your credentials, the router >>> address/port, the world to create etc. all match up. >>> >>> Back to your question: With the above scripts, your tunneling questions >>> should have clear answers. Just specify any port you'd like in the >>> above, or even better, put the router on a machine that's not behind a >>> firewall and forget about tunneling. >>> >>> Cheers, >>> - Andreas >>> >>> Joel Wilson wrote: >>>> Hello, >>>> >>>> I'm fairly new to Croquet and was going to collaborate with another >>>> person, but we're both behind firewalls. I know, though, how to set >>>> up >>>> port forwards through an SSH tunnel, so I set up the proper listeners >>>> based on the postcards and tried to connect. I'm getting an error that >>>> I >>>> suspect may be because after the initial connection, another port-pair >>>> is >>>> being attempted to be established for communication between the two >>>> routers. >>>> >>>> My questions are related to that assumption. >>>> >>>> 1) Is there a specific range where Croquet negotiates those >>>> connections >>>> 2) Can that range be reduced or set to a specific port somewhere >>>> 3) What is the class named that handles this negotiation? >>>> >>>> We're using SimpleDemo (Master) to try to establish this connection. >>>> >>>> Thanks for any assistance, >>>> >>>> Joel Wilson >>>> >>>> >>>> >>> >> >> >> >> > > |
In reply to this post by Tangaloor
Yes. That's exactly how it's supposed to be used ;-) For doing that,
simply ignore everything that refers to the harness in the participant script (the harness is what does the viewing, managing avatars etc). Essentially it boils down to this: user := 'server'. pass := 'xxxxxx'. address := NetNameResolver addressForName: 'localhost'. id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. controller := TSimpleController new. controller connectTo: address port: 4321 sessionID: id. p := controller login: user password: pass. p wait. "until connected" p := controller join. "receive messages" p wait. "until joined" island := controller newIsland. island future id: id name: 'Test'. sync := island future new: SimpleWorld. controller beServer. "act as server" controller heartbeat: 1000. "set heartbeat rate" Note that I drastically reduced the heartbeat rate since this client isn't going to be used interactively so we don't need to update it at interactive rates. Also, this script doesn't test for a pre-existing island (you could add this back in by first requesting a sync and testing whether the result is non-nil) but in this example we just recreate it from scratch. Cheers, - Andreas Joel Wilson wrote: > Andreas, > > From what I'm reading, I could potentially put a controller and an initial > island in that headless image and connect to it with a trimmed down > participant script. That way I could have a persistent world. Can a > controller run without a viewPort? > > -Joel > >> Yes, no problem. Assuming you're on a Unix box, just use: >> >> squeak -headless router.image file:///home/andreas/router.st >> >> And router.st is exactly the little script that I quoted. >> >> Cheers, >> - Andreas >> >> >> Joel Wilson wrote: >>> Andreas, >>> >>> Thank you. Is it possible to run Smalltalk without a frame buffer? >>> I've >>> got a machine in mind, but it's rack mounted and has no display. >>> >>> -Joel >>> >>>> Hi Joel - >>>> >>>> The way the demos are set up they'll work only on a local area network >>>> since they use UDP to find other peers and assign the ports randomly. >>>> The way you describe your setup you're trying to run Croquet over a WAN >>>> configuration which (currently) requires a bit more setup than usual. >>>> >>>> First, there needs to be a machine to host the router and which will >>>> also act as the rendevouz point (this may be one of your participants >>>> or >>>> a dedicated machine outside of the firewall). Just as long as it has a >>>> port that the clients can get to it'll be fine. On that machine, you >>>> want to run... >>>> >>>> The Router Script >>>> ================= >>>> >>>> id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. >>>> >>>> dispatcher := TExampleDispatcher new. >>>> dispatcher listenOn: 4321. "fixed port" >>>> dispatcher autoCreate: false. >>>> >>>> router := TSimpleRouter new. >>>> router addUserName: 'foo' password: 'bar'. >>>> dispatcher addRouter: router id: id. >>>> >>>> The key elements in the above are: >>>> - the id: Which is some unique ID that you'll use for identifying the >>>> session >>>> - the port: That's the port the participants need to reach >>>> - the authentication info: You don't want just about everybody to get >>>> there >>>> >>>> Once the router is up and running, it's time to get to... >>>> >>>> The participant script >>>> ====================== >>>> >>>> This script is a little longer since it needs to do quite a bit of >>>> setup >>>> but it's not too horrible either: >>>> >>>> >>>> user := UIManager default >>>> request: 'Enter user name' initialAnswer:'guest'. >>>> pass := UIManager default >>>> requestPassword: 'Enter password for ', user storeString. >>>> >>>> participant := CroquetParticipant new. >>>> participant setup. >>>> harness := participant instVarNamed: 'harness'. "Eeek!" >>>> >>>> address := NetNameResolver addressForName: 'localhost'. >>>> id := TObjectID readHexFrom: '5135efa79d25b6f169715bd9d1b54601'. >>>> >>>> controller := TSimpleController new. >>>> controller connectTo: address port: 4321 sessionID: id. >>>> p := controller login: user password: pass. >>>> p wait. "until connected" >>>> p := controller join. "receive messages" >>>> p wait. "until joined" >>>> p := controller sync. "request replicated state" >>>> p wait. "until sync-ed" >>>> >>>> p result ifNil:[ >>>> island := controller newIsland. >>>> island future id: id name: 'Test'. >>>> sync := island future new: SimpleWorld. >>>> ] ifNotNil:[ >>>> controller install: p result. >>>> island := controller island. >>>> ]. >>>> controller beServer. "act as server" >>>> controller heartbeat: 20. "set heartbeat rate" >>>> harness addController: controller. >>>> entry := controller island future at: #masterSpace. >>>> pc := entry future postcard. >>>> pc whenResolved:[ >>>> harness addIsland: island postcard: pc value. >>>> sync := harness viewPortal future postcardLink: pc value. >>>> sync whenResolved:[ >>>> harness startRender. >>>> participant openInWorld. >>>> ]. "ready to render" >>>> ]. >>>> >>>> >>>> Obviously, you want to make sure that your credentials, the router >>>> address/port, the world to create etc. all match up. >>>> >>>> Back to your question: With the above scripts, your tunneling questions >>>> should have clear answers. Just specify any port you'd like in the >>>> above, or even better, put the router on a machine that's not behind a >>>> firewall and forget about tunneling. >>>> >>>> Cheers, >>>> - Andreas >>>> >>>> Joel Wilson wrote: >>>>> Hello, >>>>> >>>>> I'm fairly new to Croquet and was going to collaborate with another >>>>> person, but we're both behind firewalls. I know, though, how to set >>>>> up >>>>> port forwards through an SSH tunnel, so I set up the proper listeners >>>>> based on the postcards and tried to connect. I'm getting an error that >>>>> I >>>>> suspect may be because after the initial connection, another port-pair >>>>> is >>>>> being attempted to be established for communication between the two >>>>> routers. >>>>> >>>>> My questions are related to that assumption. >>>>> >>>>> 1) Is there a specific range where Croquet negotiates those >>>>> connections >>>>> 2) Can that range be reduced or set to a specific port somewhere >>>>> 3) What is the class named that handles this negotiation? >>>>> >>>>> We're using SimpleDemo (Master) to try to establish this connection. >>>>> >>>>> Thanks for any assistance, >>>>> >>>>> Joel Wilson >>>>> >>>>> >>>>> >>> >>> >>> >> > > > > |
In reply to this post by Tangaloor
Just successfully did this with the router in Vancouver with two
different locations in L.A. L.A. -> Vancouver -> L.A. Works great. About 1/10th sec. round trip with a simple world. |
Free forum by Nabble | Edit this page |