Hallo,
ich will einen Java-Websocket-Server programmieren, der auf einem Linux/Windowsrechner läuft, die serielle Schnittstelle ausliest und die empfangenen Daten an die über den Socket verbundenen Klienten weitergibt. Damit will ich Echtzeit simulieren. Ich bekomme es einfach nicht gebacken, die empfangenen Daten an die Nutzer zu verteilen. Ich will auch keine großartigen APIs verweden , sondern es mit eigenen Mitteln hinbekommen!
Nach einer ausgiebigen Recherche habe ich folgenden Server, der eine Verbindung aufbaut, ich kann bzw konnte auch schon Daten an den Browser senden, die mir dort angezeigt worden sind, aber halt immer nur bei dem einen Klient und nicht bei allen.
Im Grunde habe ich folgendes:
Die server.java startet den Server und erstellt für jeden Benutzer einen Thread:
und die Klasse die für jeden Benutzer erstellt wird:
Im Moment bekommt jeder Klient eine Willkommensnachricht gesendet, aber immer nur der, der sich gerade verbunden hat!
Könnt ihr mir Tipps oder Hilfestellungen geben, wie ich das ganze so hinbekomme, dass ich die Benutzer, die sich verbunden haben, zusammenfassen kann, und dann an alle eine Nachricht senden kann?
Ich kann diese ja in einer Liste speicher, aber irgendwie kann ich auch nicht abfangen, wann ein Klient die Verbindung schließt. Das erschwert das ganze natürlich!
Ich danke schon mal im Vorraus für kreative Ideen!
ich will einen Java-Websocket-Server programmieren, der auf einem Linux/Windowsrechner läuft, die serielle Schnittstelle ausliest und die empfangenen Daten an die über den Socket verbundenen Klienten weitergibt. Damit will ich Echtzeit simulieren. Ich bekomme es einfach nicht gebacken, die empfangenen Daten an die Nutzer zu verteilen. Ich will auch keine großartigen APIs verweden , sondern es mit eigenen Mitteln hinbekommen!
Nach einer ausgiebigen Recherche habe ich folgenden Server, der eine Verbindung aufbaut, ich kann bzw konnte auch schon Daten an den Browser senden, die mir dort angezeigt worden sind, aber halt immer nur bei dem einen Klient und nicht bei allen.
Im Grunde habe ich folgendes:
Die server.java startet den Server und erstellt für jeden Benutzer einen Thread:
Code:
public class server {
private int portName;
private static String com = "COM1";
SerialPort serialPort;
private ServerSocket ss = null;
boolean serverAn = true;
public Hashtable<String, Integer> klienten = new Hashtable<String, Integer>();
public server(int port) {
this.portName = port;
}
public void startOpenComConnection() throws NoSuchPortException,
PortInUseException, UnsupportedCommOperationException, IOException {
CommPortIdentifier portIdentifier = CommPortIdentifier
.getPortIdentifier(com);
if (portIdentifier.isCurrentlyOwned()) {
System.out.println("Error: Port is currently in use");
} else {
CommPort commPort = portIdentifier.open(com, 2000);
if (commPort instanceof SerialPort) {
serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}
}
InputStream serialInput = serialPort.getInputStream();
(new Thread(new SerialReader(serialInput))).start();
}
public void starteServer() throws Exception {
ss = new ServerSocket(portName);
while (serverAn) {
Socket socket = ss.accept();
benutzerThread benutzerThread = new benutzerThread(socket,
this);
benutzerThread.start();
}
try {
ss.close();
System.out.println("Server gestoppt!");
} catch (Exception ex) {
System.out.println("Problem: Socket konnte nicht gestoppt werden!");
System.exit(-1);
}
}
}
und die Klasse die für jeden Benutzer erstellt wird:
Code:
public class benutzerThread extends Thread {
Socket socket;
server server;
BufferedReader in;
BufferedOutputStream out;
static int verbundeneNutzer = 0;
public benutzerThread(Socket socket, server server) {
this.socket = socket;
this.server = server;
}
@Override
public void run() {
PrintWriter prw = null;
verbundeneNutzer++;
String user = "Nutzer " + verbundeneNutzer;
while (true) {
try {
String strStream = null;
prw = new PrintWriter(socket.getOutputStream());
strStream = doRead(socket.getInputStream());
HTTPRequest req = new HTTPRequest();
String strKey = req.getParameter(strStream,
"Sec-WebSocket-Key".toLowerCase());
strKey = KeyGeneration.getKey(strKey);
writeHeaders(prw, strKey);
server.klienten.put(user, verbundeneNutzer);
System.out.println(user);
schreibeNachrichtAnNutzer("Server:" + user
+ " entered the room");
System.out.println(verbundeneNutzer);
} catch (Exception e) {
prw.write("Exception occurred processing request: "
+ e.toString());
prw.flush();
prw.close();
} finally {
try {
//socket.close();
} catch (Exception e) {
// ignore
}
}
}
}
private String doRead(InputStream in) throws Exception {
byte[] data = new byte[1024 * 4];
int iBytesRead = in.read(data);
return new String(data).substring(0, iBytesRead);
}
/**
* Write our headers to complete the connection
*
* @param out
* @param strSecKey
* -- Derived from the cliet key.
* @see KeyGeneration.java
* @throws Exception
*/
private void writeHeaders(PrintWriter out, String strSecKey)
throws Exception {
String strHeaders = "HTTP/1.1 101 Switching Protocols\r\n"
+ "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Accept: " + strSecKey + "\r\n" + "\r\n";
out.write(strHeaders);
out.flush();
}
public void schreibeNachrichtAnNutzer(String strText) throws IOException {
final byte SINGLE_FRAME_UNMASKED_MESSAGE = (byte) 0x81;
byte[] textBytes = strText.getBytes("UTF-8");
BufferedOutputStream os = new BufferedOutputStream(
socket.getOutputStream());
ByteArrayOutputStream bao = new ByteArrayOutputStream();
/* Add start of Frame */
bao.write(SINGLE_FRAME_UNMASKED_MESSAGE);
bao.write((byte) textBytes.length);
bao.write(textBytes);
bao.flush();
bao.close();
os.write(bao.toByteArray(), 0, bao.size());
os.flush();
}
}
Im Moment bekommt jeder Klient eine Willkommensnachricht gesendet, aber immer nur der, der sich gerade verbunden hat!
Könnt ihr mir Tipps oder Hilfestellungen geben, wie ich das ganze so hinbekomme, dass ich die Benutzer, die sich verbunden haben, zusammenfassen kann, und dann an alle eine Nachricht senden kann?
Ich kann diese ja in einer Liste speicher, aber irgendwie kann ich auch nicht abfangen, wann ein Klient die Verbindung schließt. Das erschwert das ganze natürlich!
Ich danke schon mal im Vorraus für kreative Ideen!