Java socket-exchange-Nachricht zwischen client und server
Ich habe Mühe, Java socket multithread, während ich Lerne, indem ich mich über socket auf Oracles Java-Seite, nach dem Lesen der Beispiel über TCP-und UDP-socket.
Ich versuche, dieses wissen nutzen, um etwas zu schreiben zum Austausch von Nachrichten zwischen client und server.
Aber, ich Frage mich, wenn die client-Nachricht an server mit Multi-Thread -, und server hat eine Bedingung.
Beispiel: Wenn die client-senden-server einen Brief eine
Server erhalten und hat einen Zustand wie
if(inputfromClient.equals("A")){
//how to make input fromClient is null after get message (inputstream) from client?
}
In der Kommentar-code-snippet oben, Sie können sehen, meine Frage, weil nach der client sendet Eingaben Ein, dann client senden nächsten Buchstaben wie B, in einer Struktur wie dieser:
if(inputfromClient.equals("A")){
if(inputfromClient.equals("B")){
//some condition
}
}
meine server-code ist wie:
public class TCPServerThread extends Thread{
Socket client = null;
BufferedReader in;
String statusBuffer = new String();
String intputLine, outputLine;
public TCPServerThread(Socket socket){
client = socket;
}
public void run(){
try {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(TCPServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
PrintWriter out = new PrintWriter(client.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
gameHandle g = new gameHandle();
boolean condition = true;
while((intputLine=in.readLine()) != null){
outputLine = g.processInput(intputLine);
out.println(outputLine);
System.out.println(outputLine);
}
out.close();
in.close();
client.close();
} catch (IOException ex) {
Logger.getLogger(TCPServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
und mein client code:
public class ClientTCP {
public static void main(String[] args) {
try {
Socket socket;
PrintWriter out = null;
BufferedReader in = null;
try {
socket = new Socket("localhost", 4444);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException ex) {
Logger.getLogger(ClientTCP.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ClientTCP.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
fromUser = stdIn.readLine();
while(fromUser!= null){
out.println(fromUser);
//System.out.println(in.readLine());
}
} catch (IOException ex) {
Logger.getLogger(ClientTCP.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Danke Ihnen sehr.
Bearbeitet
Ok, um Sinn zu machen, als ich vor erwähnen
Clients senden Nachrichten an einen server
Client: onePMode
client: internet
....
- und server-Nachrichten von client an und vergleichen Sie es
if(inputLine.equals("onePMode")){
//it will continue to compare inputline is satisfy with sub condition
if(inputLine.equals("internet"){
//do something
}
}
Bearbeitet
GameHandle Zu Handhaben Eingang
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package srpserver;
import java.net.Socket;
import java.util.Random;
/**
*
* @author ***
*/
public class gameHandle {
private String modePlay = "";
private String wait = "wait";
private String status = wait;
private String keyword = "";
private Socket client;
private String letter = "";
private String onePMode ="onePMode";
private String getWord = "getWord";
private String twoPMode = "twoPMode";
private String waitForPlayer = "waitforPlayer";
private String ready = "ready";
private String question = "question";
public gameHandle(){}
public gameHandle(Socket socket,String Mode, String keyword, String letter){
client = socket;
this.keyword = keyword;
this.letter = letter;
modePlay = Mode;
}
//array with word will be rando,
String[] words = {"laptop", "network", "device", "game", "mobile",
"word", "november", "december", "signal", "internet","localhost","boot", "socket",
"client", "server", " port", "exception", "java", "dotnet","singleton", "ejb","hibernate",
"computer", "microsoft", "lan"};
//this method get random word from array
public String getWord(){
Random r = new Random();
String randomString = words[r.nextInt(words.length)];
return randomString;
}
public String processInput(String inputString){
String outPut = "";
if(status.equals("wait")){
if(inputString.equals(onePMode)){
status = question;
outPut = "hello";
//outPut = question;
}
}else if(status.equals(question)){
if(inputString.equals(getWord)){
/*keyword = getWord();
outPut = getWord();
System.out.println(keyword);
status = question;*/
outPut = "getworrdddrdd";
System.out.println("get worddddddddd");
}else if(keyword.contains(inputString)){
System.out.println("containt");
}
}
return outPut;
}
public static void main(String[] args) {
gameHandle a = new gameHandle();
System.out.println(a.getWord());
}
}
- Was ist die Bedeutung des Kommentar genau? können Sie das noch näher erläutern? Und ich sehe, dass auf client-Seite, die Sie schreiben in einer Schleife, aber bei server, die Sie Lesen, nur eine Zeile. Ist es etwas falsch hier?
- ja ich nutze loop-client für das senden von Nachrichten kontinuierlichen zu-server aber im server-muss ich haben Zustand wie bei der client-Nachricht senden onePMode wenn diese Bedingung wahr, server nächste Bedingung in einem Zustand oben
- ok. können Sie erläutern, mehr auf die Frage (die eine, die erwähnt wird im Kommentar im code)
- es bedeutet, wenn Kunden eine Nachricht senden, wie "A" an den server, BufferedReader speichern Sie es, und dann setze ich inputLine zu speichern-Wert der Nachricht ("A"), wenn der client Geben Sie Einen, server die es zu erhalten und zu vergleichen, um die Bedingung und die server weiter zu tun, einem sub-Zustand innen eine wesentliche Voraussetzung, aber immer noch speichern Sie einen Buchstaben A in der variable
inputLine
ich will, wenn client-Typ A, server bekommen es zu vergleichen, und warten Sie für den client-Typ B zu tun, einem sub-Zustand, innen - "Wie stellen Sie input fromClient null ist nach Meldung bekommen (inputstream) aus": Wenn Sie diese Frage, ist es sinnlos. Es sei denn, Sie Fragen sich, wie Sie schreiben, " inputFromClient = null;', in welchem Fall es ist einfach nicht zu glauben. Ich kann nicht Kopf oder Schwanz Ihres Kommentars sofort oben.
- Ihre Frage ist auch sinnlos, weil
inputLine
vielleicht nicht gleich"A"
und"B"
oder"onePMode"
und"internet"
gleichzeitig. - Entfernen Sie die sinnlos
sleep()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist möglicherweise denkbar einfachste Lösung für Ihr problem.
Fand ich auch einen Fehler in Ihrem client-code. Korrigierte code ist wie folgt
Ich ausgeführt Programm auf mein Ende und es erfolgreich ausgeführt werden. Jetzt sollten Sie kein problem haben, in es.
while((inputLine == in.readline()) != null)
und dann starsbuffer wird lopp und formatieren Sie es wie : onePMode#onePMode onePMode#onePMode onePMode#onePMode onePMode#onePMode es Schleife ultil, wenn ich Sie zerstören Prozess, indem Sie x auf netbeanIch denke, was Sie wollen, ist, eine Entscheidung zu treffen, basierend auf den vorherigen Zustand. Dann alles, was Sie brauchen, ist eine Objekt-orientierte Zustandsautomaten.
Wenn der Kunde betritt
'A'
vom Anfangszustand, dann der server sollte erwarten, dass'B'
oder'C'
als nächste Eingabe. Wenn der Kunde betritt'B'
während der server im Zustand'A'
, dann server sollten erwarten, 'D' oder 'E' als nächste Eingabe. Wenn dies ist, was Sie möchten, Sie verwenden sollten,State Design Pattern.Jedem Staat Sie haben, sollten durch ein Objekt dargestellt.
Zuerst müssen Sie erstellen eine
Interface
für Staat und ableiten derStaaten aus.
Dann erstellen Sie eine wrapper-Klasse für die Kapselung Ihrer Staaten.
Diese wrapper-Klasse dient als eine state machine. Es sollten weiterhin über eine
Verweis auf den "aktuellen" State-Objekt.
Wenn der Kunde einen Charakter, es wird übergeben werden, um die wrapper-Instanz. Dann wrapper übergibt es an das aktuelle zustandsobjekt. Dann aktuelle
State
Objekt Prozess, der Daten und entscheidet über den nächsten Zustand der Maschine. Es wird einen nächsten Zustand(Objekt), und aktualisieren Sie den "ist-Zustand" Referenz der wrapper-Klasse. Dann der nächste client die Eingabe erfolgt über das neu geschaffeneState
Objekt.Hier ist ein Beispiel
Wie Sie diese in Ihren server
...
...