[cooja/serialsocket] Allow to stop server / disconnect client

This commit is contained in:
Enrico Joerns 2014-04-14 14:24:55 +02:00
parent f419274050
commit 6c0e7ae15e
2 changed files with 71 additions and 26 deletions

View File

@ -156,7 +156,19 @@ public class SerialSocketClient extends VisPlugin implements MotePlugin {
c.gridx++;
serverSelectPanel.add(serverPortField, c);
serverSelectButton = new JButton("Connect");
serverSelectButton = new JButton("Connect") { // Button for label toggeling
private final String altString = "Disconnect";
@Override
public Dimension getPreferredSize() {
String origText = getText();
Dimension origDim = super.getPreferredSize();
setText(altString);
Dimension altDim = super.getPreferredSize();
setText(origText);
return new Dimension(Math.max(origDim.width, altDim.width), origDim.height);
}
};
c.gridx++;
c.weightx = 0.1;
c.anchor = GridBagConstraints.EAST;
@ -232,11 +244,16 @@ public class SerialSocketClient extends VisPlugin implements MotePlugin {
@Override
public void actionPerformed(ActionEvent e) {
try {
serverPortField.commitEdit();
startClient(serverHostField.getText(), ((Long) serverPortField.getValue()).intValue());
} catch (ParseException ex) {
logger.error(ex);
if (e.getActionCommand().equals("Connect")) {
try {
serverPortField.commitEdit();
startClient(serverHostField.getText(), ((Long) serverPortField.getValue()).intValue());
} catch (ParseException ex) {
logger.error(ex);
}
} else {
// close socket
cleanup();
}
}
});
@ -288,7 +305,7 @@ public class SerialSocketClient extends VisPlugin implements MotePlugin {
socketStatusLabel.setForeground(ST_COLOR_CONNECTED);
serverHostField.setEnabled(false);
serverPortField.setEnabled(false);
serverSelectButton.setEnabled(false);
serverSelectButton.setText("Disconnect");
}
});
}
@ -302,7 +319,7 @@ public class SerialSocketClient extends VisPlugin implements MotePlugin {
socketStatusLabel.setText("Disconnected");
serverHostField.setEnabled(true);
serverPortField.setEnabled(true);
serverSelectButton.setEnabled(true);
serverSelectButton.setText("Connect");
}
});
}
@ -386,13 +403,13 @@ public class SerialSocketClient extends VisPlugin implements MotePlugin {
try {
numRead = in.read(data);
} catch (IOException e) {
logger.error(e.getMessage());
logger.info(e.getMessage());
numRead = -1;
continue;
}
if (numRead >= 0) {
for (int i=0; i < numRead; i++) {
for (int i = 0; i < numRead; i++) {
serialPort.writeByte(data[i]);
}
inBytes += numRead;
@ -401,8 +418,8 @@ public class SerialSocketClient extends VisPlugin implements MotePlugin {
}
}
}
logger.warn("Incoming data thread shut down");
logger.info("Incoming data thread shut down");
cleanup();
notifyClientDisconnected();
}

View File

@ -151,7 +151,19 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
c.weightx = 0.0;
socketPanel.add(serverPortField, c);
serverStartButton = new JButton("Start");
serverStartButton = new JButton("Start") { // Button for label toggeling
private final String altString = "Stop";
@Override
public Dimension getPreferredSize() {
String origText = getText();
Dimension origDim = super.getPreferredSize();
setText(altString);
Dimension altDim = super.getPreferredSize();
setText(origText);
return new Dimension(Math.max(origDim.width, altDim.width), origDim.height);
}
};
c.gridx++;
c.weightx = 0.1;
c.anchor = GridBagConstraints.EAST;
@ -221,12 +233,16 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
@Override
public void actionPerformed(ActionEvent e) {
try {
serverPortField.commitEdit();
} catch (ParseException ex) {
java.util.logging.Logger.getLogger(SerialSocketClient.class.getName()).log(Level.SEVERE, null, ex);
if (e.getActionCommand().equals("Start")) {
try {
serverPortField.commitEdit();
} catch (ParseException ex) {
java.util.logging.Logger.getLogger(SerialSocketClient.class.getName()).log(Level.SEVERE, null, ex);
}
startServer(((Long) serverPortField.getValue()).intValue());
} else {
stopServer();
}
startServer(((Long) serverPortField.getValue()).intValue());
}
});
@ -249,10 +265,11 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
@Override
public void run() {
System.out.println("onServerStarted");
socketStatusLabel.setForeground(COLOR_NEUTRAL);
socketStatusLabel.setText("Listening on port " + String.valueOf(port));
serverStartButton.setEnabled(false);
serverPortField.setEnabled(false);
serverStartButton.setText("Stop");
}
});
}
@ -290,8 +307,8 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
@Override
public void run() {
serverStartButton.setEnabled(true);
serverPortField.setEnabled(true);
serverStartButton.setText("Start");
socketStatusLabel.setForeground(COLOR_NEUTRAL);
socketStatusLabel.setText("Idle");
}
@ -381,16 +398,16 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
try {
// wait for next client
Socket candidateSocket = serverSocket.accept();
// reject connection if already one client connected
if (clientSocket != null && !clientSocket.isClosed()) {
logger.info("Refused connection of client " + candidateSocket.getInetAddress());
candidateSocket.close();
continue;
}
clientSocket = candidateSocket;
in = new DataInputStream(clientSocket.getInputStream());
out = new DataOutputStream(clientSocket.getOutputStream());
out.flush();
@ -416,14 +433,14 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
}
}
});
inBytes = outBytes = 0;
logger.info("Client connected: " + clientSocket.getInetAddress());
notifyClientConnected(clientSocket);
} catch (IOException e) {
logger.fatal("Listening thread shut down: " + e.getMessage());
logger.info("Listening thread shut down: " + e.getMessage());
try {
serverSocket.close();
} catch (IOException ex) {
@ -436,6 +453,17 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
}
}.start();
}
/**
* Stops server by closing server listen socket.
*/
public void stopServer() {
try {
serverSocket.close();
} catch (IOException ex) {
logger.error(ex);
}
}
private void startSocketReadThread(final DataInputStream in) {
/* Forward data: virtual port -> mote */
@ -454,7 +482,7 @@ public class SerialSocketServer extends VisPlugin implements MotePlugin {
try {
numRead = in.read(data);
} catch (IOException e) {
logger.error(e.getMessage());
logger.info(e.getMessage());
numRead = -1;
}
}