Недавно возникла необходимость запустить несколько экземпляров игрового сервера на одной машине. Игровой сервер разработан на платформе Reddwarf.
Причем речь идет не о настройке прозрачного горизонтального масштабирования (которое уже много лет как обещается, но всё ещё не разработано), а просто запуск двух независимых серверов.
При попытке запуска второго экземпляра сервера происходит исключение java.net.BindException: Address already in use.
Казалось бы, дело в использовании одного и того же порта обоими серверами. Меняем настройки одного из серверов чтобы задать другой порт для соединения.
Добавляем в файл sgs-server.properties строчку (порт 3214 выбран случайно):
Запускаем... ошибка та же самая!
Вот такие настройки для своих служебных портов использует сервер по умолчанию:
Добавим эти строчки в sgs-server.properties одного из серверов, изменив номера портов, получаем:
В результате второй экземпляр сервера запущен и ждет соединений на указанном нами порту!
Причем речь идет не о настройке прозрачного горизонтального масштабирования (которое уже много лет как обещается, но всё ещё не разработано), а просто запуск двух независимых серверов.
При попытке запуска второго экземпляра сервера происходит исключение java.net.BindException: Address already in use.
Казалось бы, дело в использовании одного и того же порта обоими серверами. Меняем настройки одного из серверов чтобы задать другой порт для соединения.
Добавляем в файл sgs-server.properties строчку (порт 3214 выбран случайно):
com.sun.sgs.app.root=data com.sun.sgs.app.name=GameServer com.sun.sgs.app.listener=my.server.GameServer com.sun.sgs.impl.transport.tcp.listen.port=3214
Запускаем... ошибка та же самая!
Sep 04, 2011 7:33:17 PM com.sun.sgs.impl.kernel.Kernel createServices
SEVERE: GameServer: failed to create services
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.sun.sgs.impl.kernel.Kernel.createService(Kernel.java:818)
at com.sun.sgs.impl.kernel.Kernel.setupServiceNoManager(Kernel.java:752)
at com.sun.sgs.impl.kernel.Kernel.loadCoreServices(Kernel.java:651)
at com.sun.sgs.impl.kernel.Kernel.fetchServices(Kernel.java:600)
at com.sun.sgs.impl.kernel.Kernel.createServices(Kernel.java:510)
at com.sun.sgs.impl.kernel.Kernel.createAndStartApplication(Kernel.java:484)
at com.sun.sgs.impl.kernel.Kernel.(Kernel.java:349)
at com.sun.sgs.impl.kernel.Kernel.main(Kernel.java:1344)
Caused by: java.rmi.server.ExportException: Port already in use: 44533; nested exception is:
java.net.BindException: Address already in use
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:328)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:236)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:411)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:207)
at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:112)
at sun.rmi.registry.RegistryImpl.(RegistryImpl.java:88)
at java.rmi.registry.LocateRegistry.createRegistry(LocateRegistry.java:239)
at com.sun.sgs.impl.util.Exporter.export(Exporter.java:98)
at com.sun.sgs.impl.service.watchdog.WatchdogServerImpl.(WatchdogServerImpl.java:338)
at com.sun.sgs.impl.service.watchdog.WatchdogServiceImpl.(WatchdogServiceImpl.java:352)
... 12 more
Оказывается, сервер использует некоторые порты в служебных целях: для самодиагностики и для нужд будущего масштабирования.
Вот такие настройки для своих служебных портов использует сервер по умолчанию:
com.sun.sgs.impl.service.data.store.net.server.port=44530 com.sun.sgs.impl.service.watchdog.server.port=44533 com.sun.sgs.impl.service.nodemap.server.port=44535
Добавим эти строчки в sgs-server.properties одного из серверов, изменив номера портов, получаем:
com.sun.sgs.app.root=data com.sun.sgs.app.name=GameServer com.sun.sgs.app.listener=my.server.GameServer com.sun.sgs.impl.transport.tcp.listen.port=3214 com.sun.sgs.impl.service.data.store.net.server.port=55530 com.sun.sgs.impl.service.watchdog.server.port=55533 com.sun.sgs.impl.service.nodemap.server.port=55535
В результате второй экземпляр сервера запущен и ждет соединений на указанном нами порту!
Sep 04, 2011 7:54:30 PM com.sun.sgs.impl.kernel.KernelINFO: The Kernel is ready, version: 0.10.2.1 Sep 04, 2011 7:54:30 PM com.sun.sgs.impl.service.data.store.DataStoreImpl INFO: Creating database directory : /opt/test/target/sgs-server-dist-0.10.2.1/data/dsdb Sep 04, 2011 7:54:30 PM com.sun.sgs.impl.service.watchdog.WatchdogServerImpl registerNode INFO: node:com.sun.sgs.impl.service.watchdog.NodeImpl[1,health:GREEN,backup:(none)]@cs1 registered Starting new Game Server Sep 04, 2011 7:54:31 PM com.sun.sgs.impl.kernel.Kernel startApplication INFO: GameServer: application is ready

Комментариев нет:
Отправить комментарий