Netzwerk Programmierung --> Daten werden nicht richtig übermittelt

HISTORY

Mitglied
Liebes Forum


Ich möchte gerne eine Konfigurationsdatei über unser Netzwerk schicken.

//PROBLEM//
Zum schicken der Daten verwende ich einen BufferedOutputStream wie auch zum empfangen (hier logischerweise der BufferedInputStream). Nun ist mein Problem, die Daten werden nicht vom Server empfangen. Das heisst, sie werden nur empfangen wenn ich ohne die Buffer Klassen arbeite, aber auch nur insofern wenn ich das Programm im Debug Modus starte. Sonst wird mir auch hier nur ein "?" angezeigt.

Soweit ich das ganze Analysiert habe, besteht kein Problem mit meiner Methode, sondern nur bei bos.write(b); Zeile 19 und bei
bis.read(calculateLengthOfMessage); Zeile 51.

Server Klasse
Java:
package server;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	private final ServerSocket server;

	public Server(int port) throws IOException {
		server = new ServerSocket(port);
	}

	private void startServing() {
		System.out.println("Server started...");
		
		while (true) {
			Socket client = null;
			System.out.println("Server is running...");
			
			try {
				client = server.accept();
				handleConnection(client);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (client != null)
					try {
						client.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				System.out.println("Connection is closed...");
			}
		}
	}

	private void handleConnection(Socket client) throws IOException {
		InputStream in = client.getInputStream();
		BufferedInputStream bis = new BufferedInputStream(in);

		// array mit 2 Stellen erhalten (Message: Wie lang ist die nächste
		// Nachricht.
		// b[0] = lengthOfNextMessage / 127 | b[1] = lengthOfNextMessage % 127
		byte[] calculateLengthOfMessage = new byte[2];
		bis.read(calculateLengthOfMessage);

		int lengthOfNextMessage = (127 * (int) calculateLengthOfMessage[0]) + (int) calculateLengthOfMessage[1];
		System.out.println(lengthOfNextMessage);
		byte[] message = new byte[lengthOfNextMessage];

		// Nachricht in den array füllen
		in.read(message);

		// Nachricht in der Konsole ausgeben
		for (byte b : message) {
			System.out.print(b);
		}
	}

	public static void main(String[] args) throws IOException {
		Server server = new Server(3141);
		server.startServing();
	}
}

Client Klasse
Java:
package client;

import java.net.*;
import java.io.*;

class Client {
	
	public static void main(String[] args) {
		Socket server = null;
		
		try {
			
			server = new Socket("localhost", 3141);
			OutputStream out = server.getOutputStream();
			BufferedOutputStream bos = new BufferedOutputStream(out);

			int length = createConfigurationFile ().length;
			byte[] b = { (byte) (length / 127), (byte) ((length % 127) + 1) };
			bos.write(b);

			bos.write(Integer.parseInt(Integer.toString(createConfigurationFile ().length)));
			bos.write(createConfigurationFile ());

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (server != null)
				try {
					server.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
  }
  
  public static byte[] createConfigurationFile () throws UnknownHostException {
    String defaultFile = "screen mode id:i:2" +
                   "use multimon:i:0" + "\n" +
                   "desktopwidth:i:1920" + "\n" + 
                   "desktopheight:i:1080" + "\n" +
                   "session bpp:i:32" + "\n" +
                   "winposstr:s:0,1,0,0,800,600" + "\n" +
                   "compression:i:1" + "\n" +
                   "keyboardhook:i:2" + "\n" +
                   "audiocapturemode:i:0" + "\n" +
                   "videoplaybackmode:i:1" + "\n" +
                   "connection type:i:4" + "\n" +
                   "displayconnectionbar:i:1" + "\n" +
                   "disable wallpaper:i:1" + "\n" +
                   "allow font smoothing:i:0" + "\n" +
                   "allow desktop composition:i:1" + "\n" +
                   "disable full window drag:i:1" + "\n" +
                   "disable menu anims:i:1" + "\n" +
                   "disable themes:i:0" + "\n" +
                   "disable cursor setting:i:0" + "\n" +
                   "bitmapcachepersistenable:i:1" + "\n" +
                   "full address:s:" + InetAddress.getLocalHost().getCanonicalHostName() + "\n" +
                   "audiomode:i:0" + "\n" +
                   "redirectprinters:i:1" + "\n" +
                   "redirectcomports:i:0" + "\n" +
                   "redirectsmartcards:i:1" + "\n" +
                   "redirectclipboard:i:1" + "\n" +
                   "redirectposdevices:i:0" + "\n" +
                   "redirectdirectx:i:1" + "\n" +
                   "autoreconnection enabled:i:1" + "\n" +
                   "authentication level:i:2" + "\n" +
                   "prompt for credentials:i:0" + "\n" +
                   "negotiate security layer:i:1" + "\n" +
                   "remoteapplicationmode:i:0" + "\n" +
                   "alternate shell:s:" + "\n" +
                   "shell working directory:s:" + "\n" +
                   "gatewayhostname:s:" + "\n" +
                   "gatewayusagemethod:i:4" + "\n" +
                   "gatewaycredentialssource:i:4" + "\n" +
                   "gatewayprofileusagemethod:i:0" + "\n" +
                   "promptcredentialonce:i:1" + "\n" +
                   "use redirection server name:i:0" + "\n" +
                   "drivestoredirect:s:" + "\n" +
                   "username:s:hugo\\" + System.getProperty("user.name");
    
// Auch mir ist bewusst dass das einfacher gehen würde, aber mir ist spontan nichts anderes eingefallen ;-)
    byte [] array = new byte [defaultFile.toCharArray().length];
    char [] arrayChar = defaultFile.toCharArray();
    
    int counter = 0;
    for (char c : arrayChar) {
      array[counter] = (byte) c;
      counter ++;
    }
    
    return array;
  }
}

Falls ihr noch ein paar gute Tutorials zu meinem Problem habt, bin ich euch dankbar.
Ich währe froh um eine Datailierte Antwort oder einen Link welcher das Problem genauer beschreibt.
Ausserdem würde es mich brennend interessieren, wieso es im Debug Modus funktionierte und normal nicht.


Gruss

history
 
Hallo,

ich habe jetzt nur ganz kurz reingeguckt, aber meine Vermutung ist, dass da eventuell vielleicht ein Aufruf von flush() fehlt? Das die Daten noch in dem Puffer hängen und nicht wirklich übers Netzwerk gesendet wurden?

Gruß
 
Hallo Wolf

Der Idee flush() noch einzufügen muss ich zustimmen. (Kann ja sein das nicht immer alles sofort übermittelt.
Aber leider ist das auch nicht die Lösung des Problems.
Auf jeden Fall werde ich jetzt mal das Java Tutorial anschauen und gucken wie es die dort machen.

gruss

history
 
Zurück