it-swarm.com.de

wie man ein Array von Bytes über eine TCP Verbindung (Java-Programmierung)

Kann jemand zeigen, wie ein Byte-Array über eine TCP -Verbindung von einem Senderprogramm an ein Empfängerprogramm in Java gesendet wird.

byte[] myByteArray

(Ich bin ein Neuling in der Java-Programmierung und kann anscheinend kein Beispiel finden, wie dies geschieht, und zwar an beiden Enden der Verbindung (Sender und Empfänger).) Wenn Sie ein vorhandenes Beispiel kennen, können Sie den Link möglicherweise posten (Keine Notwendigkeit, das Rad neu zu erfinden.) PS Dies istNICHTHausaufgaben! :-)

24
Mark Roberts

Die InputStream- und OutputStream-Klassen in Java behandeln Byte-Arrays nativ. Die einzige Sache, die Sie hinzufügen möchten, ist die Länge am Anfang der Nachricht, damit der Empfänger weiß, wie viele Bytes zu erwarten sind. Normalerweise möchte ich eine Methode anbieten, mit der gesteuert werden kann, welche Bytes im Byte-Array gesendet werden sollen, ähnlich wie bei der Standard-API.

Etwas wie das:

private Socket socket;

public void sendBytes(byte[] myByteArray) throws IOException {
    sendBytes(myByteArray, 0, myByteArray.length);
}

public void sendBytes(byte[] myByteArray, int start, int len) throws IOException {
    if (len < 0)
        throw new IllegalArgumentException("Negative length not allowed");
    if (start < 0 || start >= myByteArray.length)
        throw new IndexOutOfBoundsException("Out of bounds: " + start);
    // Other checks if needed.

    // May be better to save the streams in the support class;
    // just like the socket variable.
    OutputStream out = socket.getOutputStream(); 
    DataOutputStream dos = new DataOutputStream(out);

    dos.writeInt(len);
    if (len > 0) {
        dos.write(myByteArray, start, len);
    }
}

EDIT: So fügen Sie die Empfangsseite hinzu:

public byte[] readBytes() throws IOException {
    // Again, probably better to store these objects references in the support class
    InputStream in = socket.getInputStream();
    DataInputStream dis = new DataInputStream(in);

    int len = dis.readInt();
    byte[] data = new byte[len];
    if (len > 0) {
        dis.readFully(data);
    }
    return data;
}
56
Kevin Brock

Beginnen Sie einfach mit diesem Beispiel aus dem Really Big Index . Beachten Sie jedoch, dass es Zeichen und nicht Bytes überträgt und empfängt. Dies ist jedoch keine große Sache - Sie können nur mit den rohen InputStream- und OutputStream-Objekten umgehen, die die Socket-Klasse bereitstellt. Weitere Informationen zu den verschiedenen Arten von Lesern, Schreibern und Streams finden Sie in der API. Methoden, die Sie interessieren, sind OutputStream.write(byte[]) und InputStream.read(byte[]).

4
Catchwa

Das Oracle Socket Communications Tutorial scheint der geeignete Startpunkt zu sein.

Beachten Sie, dass es extra trouble ist, Zeichen in Bytes umzuwandeln. Wenn Sie auf Byte-Ebene arbeiten möchten, ziehen Sie das einfach ab.

2
bmargulies

Dieses Sun Sockets-Tutorial sollte Ihnen einen guten Ausgangspunkt geben

Ich würde Sie bitten, ObjectOutputStream und ObjectInputStream zu verwenden. Diese senden alles als Objekt und erhalten gleiches. 

ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
os.flush();
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
os.writeObject(byte_array_that_you_want_to_send);
byte[] temp = (byte[]) is.readObject();

Denken Sie auch daran, zuerst den Ausgabestrom zu erstellen, ihn zu leeren und dann den Eingabestrom fortzusetzen, denn wenn etwas im Stream ausgelassen wird, wird der Eingabestrom nicht erstellt.

1
Revanth Kumar

Was Sie verwenden müssen, ist die write-Methode eines Java.io.OutputStream und die read-Methode eines Java.io.InputStream, die Sie beide aus der Socket-Datei abrufen können, die Sie öffnen.

1
Yann Ramin

Hier ist ein Beispiel, bei dem 100-Byte-WAV-Dateibilder gleichzeitig gestreamt werden.

private Socket socket;

public void streamWav(byte[] myByteArray, int start, int len) throws IOException {

    Path path = Paths.get("path/to/file.wav");

    byte[] data = Files.readAllBytes(path);

    OutputStream out = socket.getOutputStream();
    DataOutputStream os = new DataOutputStream(out);

    os.writeInt(len);
    if (len > 0) {
        os.write(data, start, len);
    }
}

public void readWav() throws IOException {

    InputStream in = socket.getInputStream();

    int frameLength = 100; // use useful number of bytes

    int input;
    boolean active = true;

    while(active) {
        byte[] frame = new byte[frameLength];
        for(int i=0; i<frameLength; i++) {

            input = in.read();

            if(input < 0) {
                active = false;
                break;
            } else frame[i] = (byte) input;
        }

        // playWavPiece(frame);
        // streamed frame byte array is full
        // use it here ;-)
    }
}
0
Lightbeard

Ich vermute, dass die Frage falsch formuliert ist. Ich fand dies bei der Suche nach einer Antwort darauf, warum meine Verwendung von InputStream und OutputStream bei einem Byte mit dem Wert 0 das gesamte Array auf 0 zu setzen schien. Angenommen, die Bytes enthalten gültige ASCII und nicht binär. Da die Frage nicht direkt auftaucht und dies fragt, und es scheint, dass niemand anderes sie als Möglichkeit wahrgenommen hat, muss ich meine Suche anderswo befriedigen.

Ich habe versucht, eine TransparentSocket-Klasse zu schreiben, die entweder ein TCP (Socket/ServerSocket) oder ein UDP (DatagramSocket) instanziieren kann, um das DatagramPacket transparent zu verwenden. Es funktioniert für UDP, aber (noch nicht) für TCP.

Follow-up: Ich habe anscheinend bestätigt, dass diese Streams selbst für binäre Übertragungen unbrauchbar sind, sie jedoch an eine eher programmiererfreundliche Instanziierung weitergegeben werden können, z.

neuer DataOutputStream (socket.getOutputStream ()). writeInt (5);

^ Soviel zu dieser Idee. Es schreibt Daten auf "tragbare" Weise, d. H. Wahrscheinlich ASCII, was überhaupt keine Hilfe ist, insbesondere wenn eine Software emuliert wird, über die ich keine Kontrolle habe!

0
Jerry Miller
import Java.io.*;
import Java.net.*;

public class ByteSocketClient 
{
    public static void main(String[] args) throws UnknownHostException, IOException 
    {
        Socket s=new Socket("",6000);

        DataOutputStream dout=new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));

        byte[] a = {(byte)0xC0,(byte)0xA8,(byte)0x01,(byte)0x02,(byte)0x53,(byte)0x4D,(byte)0x41,(byte)0x52,(byte)0x54};
        dout.write(a);
        dout.close();
        s.close();
    }

}
0
Utpal Goswami