kostenloser Webspace werbefrei: lima-city


byte[] via tcp übertragen?

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Kann mir bitte jemand erklären warum das byte[] im Beispiel nicht übertragen wird?

    Server:
    package server; 
    
    import java.io.IOException; 
    import java.io.InputStream;
    import java.net.*; 
    
    public class Server 
    { 
    	public static void main( String[] args ) throws IOException {
    		
    		ServerSocket serverSocket = new ServerSocket( 12346 );
    
    		try {
    			Socket client = serverSocket.accept();
    			System.out.println("Accepted!");
    			InputStream is = client.getInputStream();
    			
    			byte[] buffer = new byte[256];
    			
    			is.read(buffer, 0, 256);
    			String command = "";
    			
    			int i = 0;
    			while(buffer[i] != '\0'){
    				command += buffer[i];
    				i++;
    			}
    			
    			System.out.println(command);
    			
    			serverSocket.close();
    		} catch (Exception e) {
    			// TODO: handle exception
    		}
    	} 
    }


    Client:

    package client;
    
    import java.io.OutputStream;
    import java.net.*;
    
    class Client {
    
    	public static void main( String[] args ) {
    
    		try {
    			
    			InetAddress addr = InetAddress.getByName("127.0.0.1");
    			int port = 12346;
    			
    			Socket server = new Socket(addr,port);
    			
    			OutputStream os = server.getOutputStream();
    			
    			byte[] command = new byte[256];
    			command[1] = 'a';
    			command[2] = 's';
    			command[3] = 'd';
    			command[4] = 'f';
    			command[5] = '\0';
    			
    			os.write(command,0,256);
    			os.flush();
    			
    			server.close();
    
    		} catch ( Exception e ) {
    
    			e.printStackTrace();
    		}
    	}
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Versuch es mal so:
    package server; 
    
    import java.io.IOException; 
    import java.io.InputStream;
    import java.net.*; 
    
    public class Server { 
    	public static void main(String[] args) throws IOException {
    		ServerSocket serverSocket = new ServerSocket(12346);
    		try {
    			Socket client = serverSocket.accept();
    			System.out.println("Accepted!");
    			InputStream is = client.getInputStream();
    
    			byte[] buffer = new byte[256];
    
    			is.read(buffer);
    
    			int i = 0;
    			while(buffer[i] != '\0')
    				i++;
    			String command = new String(buffer, 0, i);
    
    			System.out.println("Command: \'" + command + "\'");
    
    			serverSocket.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	} 
    }
    Schau mal was da kommt... wenn du deine Exception zwar abfängst aber nicht ausgibst suchst du natürlich ewig... und so wie du deinen String aufbaust bekommst du nicht das was du willst ;-)
  4. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Ich hab das mit der Exception zwar probiert, aber da kommt keine. Muss ein Implementierungs-Detail sein, da ich versucht hab explizit auf Array-Felder zuzugreifen und diese leer sind...

    Habs nun mit einem DataInput- und Outputstream gelöst. Das funktioniert...
    Schon komisch. Vieleicht kann man nur einzelne Bytes senden?! Mir gings eigentlich primär darum keine puffernden Datenstrukturen zu verwenden!

    Mein Code fur den Server
    package server; 
    
    import java.io.DataInputStream;
    import java.io.IOException; 
    import java.net.*; 
    
    public class Server 
    { 
    	public static void main( String[] args ) throws IOException {
    		
    		ServerSocket serverSocket = new ServerSocket( 12346 );
    
    		try {
    			Socket client = serverSocket.accept();
    			DataInputStream dis = new DataInputStream(client.getInputStream());
    			int len = dis.readInt();
    			byte[] buffer = new byte[len];
    			dis.readFully(buffer);
    			
    			String rcv = new String(buffer);
    			
    			System.out.println(len + " " + rcv);
    			
    			serverSocket.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	} 
    }


    Und der Client:

    package client;
    
    import java.io.DataOutputStream;
    import java.net.*;
    
    class Client {
    
    	public static void main( String[] args ) {
    
    		try {
    			
    			InetAddress addr = InetAddress.getByName("127.0.0.1");
    			int port = 12345;
    			
    			Socket server = new Socket(addr,port);
    			DataOutputStream dos = new DataOutputStream(server.getOutputStream());
    			
    			String com = "asdf";
    			byte[] command = com.getBytes();
    			
    			dos.writeInt(command.length);
    			dos.write(command,0,command.length);
    			
    			server.close();
    
    		} catch ( Exception e ) {
    
    			e.printStackTrace();
    		}
    	}
    }


    Haaalt stop. Zu früh gefreut. Es hat kurz funktioniert. Also beim ersten mal und jetzt gehts wieder nicht... Ich verstehs nicht. Der Server accepted die Verbindung überträgt aber keine Daten.. Strange.

    Beitrag zuletzt geändert: 8.8.2012 13:16:57 von schrotti12
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    schrotti12 schrieb:
    Haaalt stop. Zu früh gefreut. Es hat kurz funktioniert. Also beim ersten mal und jetzt gehts wieder nicht... Ich verstehs nicht. Der Server accepted die Verbindung überträgt aber keine Daten.. Strange.
    Der Server accepted die Verbindung und überträgt die Daten, nur verarbeitest du sie so, dass du dich selbst verarschst ;-)

    In der Informatik beginnt alles bei 0, auch Array-Indices. Du fängst aber bei 1 an das Array zu füllen, also bleibt die Stelle 0 mit dem Defaultwert belegt (0), was du als String-Ende interpretierst... so ginge es richtig:
    package client;
    
    import java.io.OutputStream;
    import java.net.*;
    
    class Client {
    
    	public static void main( String[] args ) {
    
    		try {
    			
    			InetAddress addr = InetAddress.getByName("127.0.0.1");
    			int port = 12346;
    			
    			Socket server = new Socket(addr,port);
    			
    			OutputStream os = server.getOutputStream();
    			
    			byte[] command = new byte[256];
    			// Arrays fangen bei "0" an ;-)
    			command[0] = 'a';
    			command[1] = 's';
    			command[2] = 'd';
    			command[3] = 'f';
    			command[4] = '\0';
    			
    			os.write(command,0,256);
    			os.flush();
    			
    			server.close();
    
    		} catch ( Exception e ) {
    
    			e.printStackTrace();
    		}
    	}
    }
  6. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Lokal funktioniert es tadellos, aber sobald die Verbindung über einen SSH-Tunnel läuft gehts nicht mehr.
    Das ist komisch..

    Ich hab die Weiterleitung mit dem Parameter "-L 12346:192.168.0.21:12345" gemacht. Der Server läuft auf Port 12345. Vom Client greif ich via 127.0.0.1:12346 auf den Server zu. Accept klappt, Daten werden nicht übertragen. Ich glaub ich werd langsam verrückt...
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    schrotti12 schrieb:
    Ich hab die Weiterleitung mit dem Parameter "-L 12346:192.168.0.21:12345" gemacht. Der Server läuft auf Port 12345. Vom Client greif ich via 127.0.0.1:12346 auf den Server zu. Accept klappt, Daten werden nicht übertragen. Ich glaub ich werd langsam verrückt...
    Gib mal byteweise die übertragenen Daten aus...
    ansonsten bekommst du bei is.read(buffer) die Anzahl der übertragenen Bytes zurück, eventuell solltest du das mal ausgeben.
  8. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Das gibt interessanterweise gar nichts aus! Es werden anscheinend keine Bytes gelesen?!? Die Verbindung steht, aber Daten werden keine übertragen. Ich verstehs einfach nicht! V.a. da es sich ja um eine TCP-Verbindung handelt (UDP kann anscheinend nicht über SSH-Tunnel laufen) dürfte der Client nicht einfach beenden sondern müsste Exceptions werfen wenn etwas nicht klappt...
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    schrotti12 schrieb:
    Das gibt interessanterweise gar nichts aus! Es werden anscheinend keine Bytes gelesen?!?
    Der Server sagt also "Accept", aber der Client gibt nichts aus? Wenn er nicht
    Command: ''
    ausgibt (vorausgesetzt du verwendest meinen Code) blockt er beim Lesen... dann könntest du vor dem is.read() noch mit
    System.out.println("Available: " + is.available());
    ausgeben ob überhaupt (und wie viele) Bytes zum Lesen vorhanden sind.
  10. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Wie es scheint wars ein Problem mit dem Datentyp.
    Ich habs jetzt aus einem Tutorial aus dem Internet kopiert und so gehts...

    Server:
    package server;
    
    import java.io.*;
    import java.net.*;
    
    class Server {
    	
    	public static void main(String argv[]) throws Exception {
    		
    		String clientSentence;
    		
    		ServerSocket welcomeSocket = new ServerSocket(12345);
    		boolean run = true;
    		Socket connectionSocket = welcomeSocket.accept();
    		BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    			
    		while(run) {
    
    			clientSentence = inFromClient.readLine();
    			System.out.println("Received: " + clientSentence);
    			
    			if("exit".equals(clientSentence) || clientSentence == null){
    				run = false;
    			}
    			
    		}
    		
    		welcomeSocket.close();
    	}
    }


    Client:

    package client;
    
    import java.io.*;
    import java.net.*;
    
    class Client {
    
    	public static void main(String argv[]) throws Exception {
    		
    		String sentence;
    		
    		BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
    		Socket clientSocket = new Socket("localhost", 12346);
    		DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    		boolean run = true;
    		
    		
    		while(run){
    			sentence = "";
    			sentence = inFromUser.readLine();
    			
    			System.out.println("Sending: " + sentence);
    			
    			if("exit".equals(sentence)){
    				run = false;
    			}
    			
    			outToServer.writeBytes(sentence + '\n');
    			
    		}
    		
    		
    		clientSocket.close();
    	}
    }


    Über die Ports nicht wundern. Läuft über eine Portweiterleitung eines SSH-Tunnels...

    Beitrag zuletzt geändert: 9.8.2012 8:58:36 von schrotti12
  11. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    schrotti12 schrieb:
    Wie es scheint wars ein Problem mit dem Datentyp.
    Das muss aber irgendwie funktionieren... es kann doch nicht sein, dass du keine einzelnen Bytes übertragen kannst! Hast du mit is.available() geschaut gehabt ob Daten angekommen sind?

    Hast du mal mit
    int c = is.read();
    versucht einzelne Bytes zu übertragen?

    Wenn du einen Stream komplett lesen willst würdest du das so machen:
    byte[] buf = new byte[128];
    int n;
    StringBuffer data = new StringBuffer();
    while((n = is.read(buf)) != -1)
    	data.append(new String(buf, 0, n));
    System.out.println("Data: \'" + data.toString() + "\'");

    Was hast du eigentlich vor? Einfach nur Zeilen zu übertragen? Oder einen "echo"-Service bauen?

    Dein Beispiel mit dem 0-Terminierten String ließe sich so umsetzen (ungetestet):
    int c;
    StringBuffer data = new StringBuffer();
    while((c = is.read()) != 0)
    	data.append(String.valueOf(c));
    System.out.println("Data: \'" + data.toString() + "\'");
  12. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Ja, hab ich probiert.

    isAvailable liefterte mir immer false zurück und read blockierte.
    Keine Ahnung warum da nichts im Stream war. Dem gehe ich schon noch auf den Grund :-)

    Interessanterweise hats lokal funktioniert nur eben nicht über eine getunnelte TCP-Verbindung!?

    Die letzte Version hab ich jetzt getestet und sie funktioniert. Selbst wenn ich die Putty-Session schließe bleibt das Putty-Fenster offen, da die TCP-Verbindung noch offen ist und bleibt. Erst wenn ich diese schließe, wird das SSH-Fenster geschlossen.
  13. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    schrotti12 schrieb:
    isAvailable liefterte mir immer false zurück und read blockierte.
    Keine Ahnung warum da nichts im Stream war. Dem gehe ich schon noch auf den Grund :-)
    "isAvailable"? Nicht "available()"?
    Das heißt also, dass die Daten vom Client gar nicht am Server angekommen sind wie du getunnelt hast? Interessant...

    schrotti12 schrieb:
    Die letzte Version hab ich jetzt getestet und sie funktioniert. Selbst wenn ich die Putty-Session schließe bleibt das Putty-Fenster offen, da die TCP-Verbindung noch offen ist und bleibt. Erst wenn ich diese schließe, wird das SSH-Fenster geschlossen.
    Das ist auch klar, weil du danach noch
    deinsocket.close();
    ausführen musst...
  14. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Faszinierend!
    Ich habe jetzt die Schleife auf Client-Seite entfernt und versuche lediglich einen mit '\n' abgeschlossenen String per TCP zu übertragen. Er baut zwar die verbindung auf zeigt den String aber auf Serverseite nicht an. Trotz flush und close welche ich auf Client-Seite ausführe... Sehr komisch! Hab ich da vlt. einen Denkfehler drinnen auf den ich grad nich draufkomm?!

    Server:
    package server;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    public class Client extends Thread {
    
    	private Socket m_connection;
    	private String m_message;
    	private Receiver m_receiver;
    
    	public Client(Socket connection, Receiver r) {
    		
    		m_receiver = r;
    		m_connection = connection;
    	}
    
    	@Override
    	public void run() {
    
    		try {
    
    			boolean run = true;
    			BufferedReader inFromClient = new BufferedReader(new InputStreamReader(m_connection.getInputStream()));
    			
    			System.out.println("Receiving data!");
    			
    			while(run) {
    
    				m_message = inFromClient.readLine();
    				
    				if("exit".equals(m_message) || m_message == null){
    					run = false;
    					m_connection.close();
    					m_receiver.disconnect(this);
    				} else {
    					System.out.println(m_message);
    				}
    			}
    		} catch (IOException ieo){
    			System.out.println(ieo.toString());
    		}
    	}
    }


    Client:
    package client;
    
    import java.io.*;
    import java.net.*;
    
    class Client {
    
    	public static void main(String argv[]) {
    
    		try{
    
    			String sentence =   "HELO server" + "\n";
    			Socket clientSocket = new Socket("localhost", 12700);
    			DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    			outToServer.writeBytes(sentence);
    			outToServer.flush();
    			outToServer.close();
    			clientSocket.close();
    		} catch (IOException ioe){
    			System.out.println(ioe.toString());
    		}
    	}
    }


    Nciht über den Code wundern. Der Server läuft bei mir jetzt separat und startet neue Clients in Threads, damit der Anfrage-Server gleich wieder zur Verfügung steht.

    =============== EDIT ===============

    package server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Vector;
    
    public class Receiver {
    	
    	
    	private int m_port = 21120;
    	private Vector<Client> m_connectedClients;
    	private ServerSocket m_serverSocket;
    	
    	public Receiver() {
    		
    
    		m_connectedClients = new Vector<Client>();
    		
    			
    		try {
    
    			m_serverSocket = new ServerSocket(m_port);
    			
    			while(true){
    				Socket newClientSocket = m_serverSocket.accept();
    				Client newClientConnection = new Client(newClientSocket,this);
    				
    				m_connectedClients.add(newClientConnection);
    				System.out.println("Client connected!");
    				newClientConnection.start();
    			}
    			
    
    			
    		} catch (IOException ieo){
    			
    			System.out.println("Server terminated because last user left.");
    		}
    	}
    
    	public void disconnect(Client client) {
    		m_connectedClients.remove(client);
    		
    		if(m_connectedClients.isEmpty()){
    			
    			System.out.println("Last user left! Waiting for new connections!");
    		}
    	}
    }


    Beitrag zuletzt geändert: 10.8.2012 8:48:59 von schrotti12
  15. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Wenn du noch den Code herzeigst der Serverseitig die Threads startet kann ich mir das ja nochmal ansehen... nicht dass dann der Fehler eventuell dort liegt und ich ihn nicht finden kann ;-)

    EDIT:
    Ich habe mir deinen Code 1:1 kopiert und übersetzt, alles hat funktioniert. Mir ist nur eines aufgefallen: beim Server hast du einen anderen Port als beim Client definiert... könnte das der Fehler sein? Oder tunnelst du wieder über SSH?

    Beitrag zuletzt geändert: 10.8.2012 9:03:04 von hackyourlife
  16. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Immer noch über SSH ... Das ist ja das komische. Entweder pufferts da irgendwo auf dem Weg dazwischen oder das funktioniert nicht über SSH ...
  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!