Hallo,
ich schreibe gerade an einer kleinen Android App, bei der ich mich auch mit meinem Server verbinde... Aber da das irgendwie nicht funktioniert hat, habe ich eine Beispiel App geschrieben, die einfach eine einzelen Nachricht an den Server sendet.
Hier ist der Server:
Und der Client:
Wenn ich den Server, und danach die App starte, dann printet der Server erst einmal "Connection". Das heißt ja eigentlich, dass ich eine Verbindung habe. Aber der Server empfängt die Nachricht "Hallo" einfach nicht! Es wird auch keine Exception oder so geworfen... Wenn ich jetzt das Socket (also Client-Side) schließe, oder die Methode shutdownOutput() aufrufe, wird die Nachricht gesendet! Ich will mein Socket aber natürlich für mehr als nur eine Nachricht benutzen... Was macht denn ein shutdownOutput() anders, als ein flush()...?
ich schreibe gerade an einer kleinen Android App, bei der ich mich auch mit meinem Server verbinde... Aber da das irgendwie nicht funktioniert hat, habe ich eine Beispiel App geschrieben, die einfach eine einzelen Nachricht an den Server sendet.
Hier ist der Server:
Java:
public class Server {
public static void main(String[] args) {
new Server().go();
}
public void go() {
try {
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(5000);
while(true) {
Socket clientSocket = serverSocket.accept();
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("Connection");
}
} catch(Exception e) {
e.printStackTrace();
}
}
public class ClientHandler implements Runnable {
private BufferedReader br;
private Socket socket;
private BufferedWriter bw;
public ClientHandler(Socket clientSocket) {
try {
socket = clientSocket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch(Exception e) {
e.printStackTrace();
}
}
public void run() {
try {
String nachricht;
while((nachricht = br.readLine()) != null) {
System.out.println("Nachricht:" + nachricht);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
Und der Client:
Java:
public class MainActivity extends Activity {
private Socket s;
@Override
protected void onCreate(Bundle savedInstanceState) { //Wird beim Start der App aufgerufen
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new OpenConnection()).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) { //Das muss man nicht beachten
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public class OpenConnection implements Runnable {
public void run() {
try {
s = new Socket("letorat.selfhost.bz", 5000);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
writer.write("hello");
writer.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Wenn ich den Server, und danach die App starte, dann printet der Server erst einmal "Connection". Das heißt ja eigentlich, dass ich eine Verbindung habe. Aber der Server empfängt die Nachricht "Hallo" einfach nicht! Es wird auch keine Exception oder so geworfen... Wenn ich jetzt das Socket (also Client-Side) schließe, oder die Methode shutdownOutput() aufrufe, wird die Nachricht gesendet! Ich will mein Socket aber natürlich für mehr als nur eine Nachricht benutzen... Was macht denn ein shutdownOutput() anders, als ein flush()...?