Java-senden Nachricht zwischen server und client ohne newline-Zeichen
Ich habe einen client, der eine Verbindung zu einem server. Die server-und die client-exchange-Daten im string-format. Das problem ist, dass der server nicht mit einem '\n' - Zeichen am Ende der Nachricht, und weil dieser der client blockiert, in readLine()
Methode. Leider ist die server-Seite können nicht geändert werden. Wie kann das Lesen aus stream diese Art von Nachricht, die nicht '\n' am Ende?
My client code:
public class json
{
private static Socket socket;
public static void main(String args[])
{
String sendMessage = "";
Gson gson = new Gson();
JSON_package authentication = new JSON_package();
authentication.setType("Identifying");
authentication.setSource("exampleClient");
Package_Parser pp = new Package_Parser();
sendMessage = gson.toJson(authentication);
sendMessage = authentication.buildPackage(sendMessage);
try
{
String host = "host_address";
int port = port_number;
InetAddress address = InetAddress.getByName(host);
System.out.println("Connecting.");
socket = new Socket(address, port);
System.out.println("Connected.");
//Send the message to the server
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(sendMessage);
bw.flush();
System.out.println("Message sent to the server : "+sendMessage);
//Get the return message from the server
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuffer buffer = new StringBuffer();
String message = br.readLine();
message = pp.Parser(message);
System.out.println("Message received from the server : " +message);
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
//Closing the socket
try
{
socket.close();
System.out.println("Closed.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
- Was ist der EOF?
- Lesen Sie das Ergebnis mit read(char[] cbuf, int off, int len) Methode. Und parsing-es-zu-string-manuell
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, zu verwenden bereit und read(char c) Methoden.
Hier ist ein Beispiel:
Die einfachste Lösung ist, um die Nachricht zu Lesen Charakter pro Charakter, aber das Hauptproblem hier ist, zu wissen, Wann die Nachricht vollständig ist. In einem line-Protokoll ist einfach, der Zeilenumbruch, die gesendet wurde, ist die "Trennlinie" zwischen Nachrichten. Ohne, gibt es zwei mögliche Situationen, in denen dieses problem leicht zu lösen:
Fall 1: die Botschaft hat immer einen festen Charakter am Ende, kann nicht auftreten, in der Nachricht
Fall 2: die Nachricht hat eine Feste Länge
In beiden Fällen müssen Sie code hinzufügen, um zu überprüfen, die der Vernunft von dem, was Sie erhielt, die Sie möglicherweise erhalten haben EOF beim Lesen.
Wenn es keine offensichtliche message separator und die Nachricht eine variable Länge, es wird viel schwieriger.
Den Punkt
readLine()
ist, Daten zu Lesen, wo es wirklich gewährleistet ist, dass die Eingabe endet mit einem Zeilenumbruch. Im Allgemeinen, wenn das analysieren von Eingaben, es muss etwas token - einige Zeichen oder eine Kombination von Zeichen in der Eingabe, die Sie verwenden können, um zu entscheiden, obWenn Sie nicht garantieren können, dass ein newline gesendet wird, dann
readLine()
ist das falsche Werkzeug für den job. Verwenden Sie so etwas wie den Charakter-array read-Methode vonInputStreamReader
statt. Sie haben, Durchlaufen Sie das array von Zeichen, die Sie Lesen, und herauszufinden, wenn Sie genügend input, um mit zu arbeiten. Sie können auch die one-character-at-a-timeread()
Methode derInputStreamReader
was in einfacher, aber wahrscheinlich weniger effizienten code.Wenn Sie die character-array-version von
read()
, und wenn Sie gehen zurück auf das sammeln von Eingabe-nach der Analyse einige, vergessen Sie nicht zu setzen, was übrig bleibt, wenn Sie nicht bekommen, genug, um zu analysieren, zurück in die Warteschlange zu Griff auf die nächste Runde.