How can I close/disconnect server?

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]