byte[] via tcp übertragen?
lima-city → Forum → Programmiersprachen → Java
array
buffer
byte
code
datum
dis
fenster
import
parameter
port
run
server
strang
string
system
tunnel
url
verbindung
weiterleitung
wundern
-
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(); } } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 -
schrotti12 schrieb:
Der Server accepted die Verbindung und überträgt die Daten, nur verarbeitest du sie so, dass du dich selbst verarschst
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.
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(); } } }
-
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... -
schrotti12 schrieb:
Gib mal byteweise die übertragenen Daten aus...
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...
ansonsten bekommst du bei is.read(buffer) die Anzahl der übertragenen Bytes zurück, eventuell solltest du das mal ausgeben. -
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...
-
schrotti12 schrieb:
Der Server sagt also "Accept", aber der Client gibt nichts aus? Wenn er nicht
Das gibt interessanterweise gar nichts aus! Es werden anscheinend keine Bytes gelesen?!?
ausgibt (vorausgesetzt du verwendest meinen Code) blockt er beim Lesen... dann könntest du vor dem is.read() noch mitCommand: ''
System.out.println("Available: " + is.available());
ausgeben ob überhaupt (und wie viele) Bytes zum Lesen vorhanden sind. -
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 -
schrotti12 schrieb:
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?
Wie es scheint wars ein Problem mit dem Datentyp.
Hast du mal mitint 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() + "\'");
-
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. -
schrotti12 schrieb:
"isAvailable"? Nicht "available()"?
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 :-)
Das heißt also, dass die Daten vom Client gar nicht am Server angekommen sind wie du getunnelt hast? Interessant...
schrotti12 schrieb:
Das ist auch klar, weil du danach noch
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.
ausführen musst...deinsocket.close();
-
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 -
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 -
Immer noch über SSH ... Das ist ja das komische. Entweder pufferts da irgendwo auf dem Weg dazwischen oder das funktioniert nicht über SSH ...
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage