web-dev-qa-db-ja.com

TCP接続(Javaプログラミング)を介してバイト配列を送信する方法

Javaで送信者プログラムから受信者プログラムにTCP接続を介してバイト配列を送信する方法をデモンストレーションできますか。

byte[] myByteArray

(私はJavaプログラミングに慣れていないので、接続の両端(送信者と受信者を示す)の例を見つけることができないようです。)既存の例では、リンクを投稿できます(車輪を再発明する必要はありません。)PSこれは[〜#〜] not [〜#〜]宿題!:-)

25
Mark Roberts

Javaネイティブにバイト配列を処理する)のInputStreamおよびOutputStreamクラス。追加したいのは、メッセージの先頭の長さです。私は通常、標準APIと同様に、バイト配列内のどのバイトを送信するかを制御できるメソッドを提供するのが好きです。

このようなもの:

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 [〜#〜]:受信側を追加するには:

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

Really Big Index から この例 で始めてください。ただし、バイトではなく文字を送受信するように設計されていることに注意してください。ただし、これは大したことではありません-InputStreamクラスが提供する生のOutputStreamおよびSocketオブジェクトを処理できます。さまざまなタイプのリーダー、ライター、およびストリームの詳細については、APIをご覧ください。興味のあるメソッドはOutputStream.write(byte[])InputStream.read(byte[])です。

4
Catchwa

The Oracle Socket Communications Tutorial は適切な起動ポイントのようです。

文字をバイトに変換するために、余分なトラブルを行うことに注意してください。バイトレベルで作業する場合は、それを剥がしてください。

2
bmargulies

この Sun Socketsチュートリアル は、良い出発点になるはずです。

ObjectOutputStreamとObjectInputStreamを使用するようお願いします。これらはすべてをオブジェクトとして送信し、同じものとして受信します。

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();

また、最初に出力ストリームを作成し、フラッシュしてから入力ストリームを続行することを忘れないでください。ストリームに何かが残っていると、入力ストリームが作成されないためです。

1
Revanth Kumar

使用する必要があるのは、Java.io.OutputStreamwriteメソッド、およびJava.io.InputStreamreadメソッドです。どちらもSocketから取得できますあなたは開ける。

1
Yann Ramin

これは、一度に100バイトのwavファイルフレームをストリーミングする例です。

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

質問の言葉遣いが間違っていると思います。 InputStreamとOutputStreamの使用が値0のバイトに遭遇したときに配列全体を0に設定しているように見える理由の答えを探しているときにこれを見つけました。これらはバイトに有効なASCIIバイナリ。質問がすぐに出てこれを尋ねるわけではなく、他の誰もそれを可能性として捉えていないようですので、他の場所で自分の探求を満足させる必要があると思います。

私がやろうとしていたことは、TCP(Socket/ServerSocket)またはUDP(DatagramSocket)のいずれかをインスタンス化して、DatagramPacketを透過的に使用できるTransparentSocketクラスを作成することでした。 UDPでは機能しますが、TCPでは(まだ)機能しません。

フォローアップ:これらのストリーム自体はバイナリ転送には役に立たないことを確認したようですが、プログラマ向けのインスタンス化に渡すことができます。

new DataOutputStream(socket.getOutputStream())。writeInt(5);

^その考えはこれで終わりです。 「ポータブル」な方法でデータを書き込みます。つまり、おそらくASCIIです。これは、特に私が制御できないソフトウェアをエミュレートする場合にはまったく役に立ちません。

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