Ich erstelle einen einfachen Netzwerk-Client. Es liest eine Textdatei und legt jede Zeile im Netzwerk ab. Am anderen Ende befindet sich ein Server, der die eingehende Leitung liest und mit einer CSV-Textzeile antwortet.Der zweite Socket-Write scheint nicht an das Netzwerk zu senden
Die Ausgangsdatei ich zum Testen bin mit ist einfach:
6216448319, Richard Nixon, Anmelden
6216448319, Richard Nixon, Abmelden
Die Antwort sollte sein "eingeloggt." gefolgt von "Abgemeldet".
Die erste Zeile verarbeitet einwandfrei, aber obwohl die zweite Zeile in den Socket geschrieben scheint, sieht der Server nie eine eingehende Nachricht. Ich habe mein Bestes getan, um der Dokumentation und verschiedenen Online-Tutorials zu folgen, aber nichts, was ich gesehen habe, scheint das gleiche Verhalten zu zeigen. Was vermisse ich?
Wenn ich jede Zeile in einer eigenen Datei sende, reagiert der Server richtig.
protected Integer call() {
LOG.info("Starting spooler for file {}, address {}:{}", spoolFile, ipAddress, port);
InetAddress server = null;
try {
server = InetAddress.getByName(ipAddress);
LOG.info("IP Address: {}", server.getHostAddress());
} catch (Exception e) {
LOG.error("Unknown host: {}", ipAddress, e);
}
try (Socket socket = new Socket(server, port);
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//PrintWriter socketWriter = new PrintWriter(socket.getOutputStream(), true);
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(spoolFile)))
) {
// Read the spool file line by line and put it out on the wire.
String line;
while ((line = fileReader.readLine()) != null) {
if (isCancelled()) {
LOG.error("Spool has been cancelled.");
break;
}
line = line.trim();
LOG.info("OUT({}): [{}]", line.length(), line);
//Wait until the channel has successfully written out the line.
LOG.info("Socket is {} for write.", socket.isConnected() ? "connected" : "not connected");
socketWriter.write(line);
socketWriter.flush();
TalkmanMessage outMessage = new TalkmanMessage(line);
outMessageList.add(outMessage);
// Wait for the network to respond.
// Apparently, readline() blocks until a message is received.
LOG.info("Waiting for response...");
LOG.info("Socket is {} for read.", socket.isConnected() ? "connected" : "not connected");
String msg = socketReader.readLine();
LOG.info("IN({}): [{}]", msg == null ? null : msg.length(), msg);
TalkmanMessage inMessage = new TalkmanMessage(msg);
inMessage.setDelay(
Duration.between(outMessage.getTime(), inMessage.getTime()).toNanos());
inMessageList.add(inMessage);
//The readline() seems to leave a non-printing byte in the socket. Read that out.
int leftOver;
do {
LOG.info("Socket is {} for EOL", socket.isConnected() ? "connected." : "not connected");
leftOver = socketReader.read();
LOG.info("Read {} from socket.", leftOver);
} while (leftOver > -1);
}
} catch (Exception e) {
LOG.error("Unable to read from file/write to .", e);
}
return 1;
}
Die Logging-Befehle erzeugen die folgende Ausgabe:
OUT(29): [6216448319,Richard Nixon,Log In]
Socket is connected for write.
Waiting for response...
Socket is connected for read.
IN(12): ["Logged in."]
Socket is connected for EOL
Read 13 from socket. S
Socket is connected for EOL
Read 10 from socket.
Socket is connected for EOL
Read -1 from socket.
OUT(30): [6216448319,Richard Nixon,Log Out]
Socket is connected for write.
Waiting for response...
Socket is connected for read. IN(null): [null]
Socket is connected for EOL
Read -1 from socket.
Ihr letzter Vorschlag war der Schlüssel.Es gab kein Protokoll per se, aber aufgrund von Einschränkungen in der Vergangenheit erwartete der Server, dass der Socket nach jeder Antwort geschlossen und ein neuer Socket vor jeder Übertragung erstellt wurde. –
Nein. Der Server * schließt * den Socket nach jeder Antwort, nicht nur 'erwartet'. Deshalb hat 'read()' am Client -1 zurückgegeben. – EJP