Hi everyone,
I’m trying to close and then recreate the server and I got this error:
Caused by: com.jme3.network.kernel.KernelException: Error hosting:0.0.0.0/0.0.0.0:5001
at com.jme3.network.kernel.tcp.SelectorKernel.initialize(SelectorKernel.java:98)
at com.jme3.network.base.DefaultServer.start(DefaultServer.java:113)
at main.niftyfunctions.onOption2(niftyfunctions.java:376)
… 39 more
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:119)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:52)
at com.jme3.network.kernel.tcp.SelectorKernel$SelectorThread.connect(SelectorKernel.java:251)
at com.jme3.network.kernel.tcp.SelectorKernel.initialize(SelectorKernel.java:95)
… 41 more
I think I got that error because I didnt cleanly closed the server.
here is the code I used to create/close the server.
[java]
else if (id.equals(“networkCreateHost”)) {
try {
server = Network.createServer(5001,5001);
server.start();
network=true;
type=“server”;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//probe code
Serializer.registerClass(MyMessage.class);
Serializer.registerClass(MyNiftyMessage.class);
server.addMessageListener(serverListener, MyMessage.class);
server.addMessageListener(serverListener, MyNiftyMessage.class);
nifty.getCurrentScreen().findElementByName(“networkStatus”).findNiftyControl(“networkStatus”, LabelControl.class).setText(“Status: Server hosting”);
}
[/java]
[java]
else if (id.equals(“networkCancel”)) {
nifty.gotoScreen(“start”);
try {
client.close();
server.close();
} catch (Exception e) {
// TODO: handle exception
}
network=false;
type="";
}
[/java]
in tutorial I saw this:
You must override the server’s destroy() method to close the connection when the server quits:
@Override
public void destroy() {
myServer.close();
super.destroy();
}
I also tried something in main Class where I extended simpleapplication + initialized server,client and others
and it didnt work either.
@Override (Eclipse told me Override method in “Application” , is this the server’s destroy or not?)
public void destroy() {
if (type.equals(“server”)) {
server.close();
super.destroy();
}
if (type.equals(“client”)) {
client.close();
super.destroy();
}
}
so how can I cleanly close server/client ?
I made a little test
Space: create server
D: disconnect/close/destroy server
Space–> OK
Space Space → error, address already in use
Space Space Esc → close the window
Space Space D → frozen , because Esc wont close the window, dont see any exception
[java]
package network;
import com.jme3.app.SimpleApplication;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.network.Network;
import com.jme3.network.Server;
public class main extends SimpleApplication implements ActionListener {
Server server;
@Override
public void simpleInitApp() {
initkeys();
flyCam.setEnabled(false);
}
private void initkeys() {
inputManager.addMapping("C", new KeyTrigger(keyInput.KEY_SPACE)); //connect
inputManager.addMapping("D", new KeyTrigger(keyInput.KEY_D)); //disconnect
inputManager.addListener(this, new String[]{"C","D"});
}
public static void main(String[] args) {
main app= new main(); app.setShowSettings(false); app.start();
}
@Override
public void onAction(String name, boolean keyPressed, float arg2) {
if (name.equals("C")&&keyPressed) {
try {
System.out.println("create Server pressed");
server= Network.createServer(5000, 5000);
server.start();
} catch (Exception e) {
System.out.println("server add exception");
e.printStackTrace();
}
}
if (name.equals("D")&&keyPressed) {
try {
if (server.isRunning()) {
System.out.println("destroy pressed");
server.close();
// destroy();
}
} catch (Exception e) {
System.out.println("server remove exception");
e.printStackTrace();
}
}
}
@Override
public void destroy() {
server.close();
super.destroy();
}
}//end of class[/java]