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: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 willst12345678910111213141516171819202122232425262728293031
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();
}
}
}
-
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
1234567891011121314151617181920212223242526272829package
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:
12345678910111213141516171819202122232425262728293031package
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:12345678910111213141516171819202122232425262728293031323334353637package
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: ''
ausgeben ob überhaupt (und wie viele) Bytes zum Lesen vorhanden sind.1System.out.println(
"Available: "
+ is.available());
-
Wie es scheint wars ein Problem mit dem Datentyp.
Ich habs jetzt aus einem Tutorial aus dem Internet kopiert und so gehts...
Server:
123456789101112131415161718192021222324252627282930package
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:
1234567891011121314151617181920212223242526272829303132333435package
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 mitversucht einzelne Bytes zu übertragen?1int
c = is.read();
Wenn du einen Stream komplett lesen willst würdest du das so machen:123456byte
[] 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):12345int
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:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546package
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:
1234567891011121314151617181920212223package
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 ===============
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package
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